パイプを通して一連のコマンドを実行するスクリプトがあります。スクリプトに渡されたパラメータに基づいています。
- ファイルを暗号化してハッシュを計算し、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
各命令スキームの第2及び第3の部分は同じままである。最初の部分のみが変更され、それぞれが1つのgpg2
場合、gzip
別の場合、cat
最後の場合に変更されます。
チェーンの2番目と3番目の部分でコードが重複して迷惑になります。
コードの重複を削除する方法はありますか?つまり、次のようにします。
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
パイプが捕捉されます。みんなstmtの標準出力if
。
このコード(あなたのコードに似ていますが、より単純化されています)は要点を示しています。
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