我有一个脚本应该通过管道执行一系列命令。根据传递给脚本的参数:
- 它要么加密文件,计算其哈希值,然后将其发送到 REST 服务。
- 或者它压缩文件,计算其哈希值,并将其发送到 REST 服务。
- 或者它只是读取文件,计算其哈希值,然后将其发送到 REST 服务。
if [ "$encryption" = "GPG" ]; then
gpg2 \
--batch \
--passphrase-file "$keyFile" \
--output - \
--symmetric \
--compress-level "$compressLevel" \
"$filePath" | \
./scripts/sha1.py --store "$sha1Destination" | \
curl --silent -X PUT --limit-rate "$limitRate" "$uri" -F files[]=@-
elif [ "$encryption" = "disabled" ]; then
if [ "$compressLevel" > 0 ]; then
gzip --stdout "$filePath" -"$compressLevel" | \
./scripts/sha1.py --store "$sha1Destination" | \
curl --silent -X PUT --limit-rate "$limitRate" "$uri" -F files[]=@-
else
cat "$filePath" | \
./scripts/sha1.py --store "$sha1Destination" | \
curl --silent -X PUT --limit-rate "$limitRate" "$uri" -F files[]=@-
fi
fi
每个命令链的第二部分和第三部分保持不变:只有第一部分发生变化,分别是gpg2
一种情况、gzip
另一种情况和cat
最后一种情况。
我对链的第二部分和第三部分的代码重复感到恼火。
有没有办法消除代码重复,即执行以下操作:
if [ "$encryption" = "GPG" ]; then
...
elif [ "$encryption" = "disabled" ]; then
if [ "$compressLevel" > 0 ]; then
...
else
...
fi
fi
... | \
./scripts/sha1.py --store "$sha1Destination" | \
curl --silent -X PUT --limit-rate "$limitRate" "$uri" -F files[]=@-
答案1
是的,您可以删除重复的代码。只需将管道放在 后面,fi
管道就会捕获全部来自if
stmt 的标准输出。
这段代码(与您的代码类似,但更加简化)说明了这一点:
if [ "$a" = y ]
then
echo abc1
else
echo abc2
fi | sed 's/abc/ABC/'
两个语句的输出echo
均由sed
管道处理。
例如:
$ a=y; if [ "$a" = y ]; then echo abc1; else echo abc2; fi | sed 's/abc/ABC/'
ABC1
$ a=n; if [ "$a" = y ]; then echo abc1; else echo abc2; fi | sed 's/abc/ABC/'
ABC2