パイプラインの一部を動的に切り替えるには?

パイプラインの一部を動的に切り替えるには?

パイプを通して一連のコマンドを実行するスクリプトがあります。スクリプトに渡されたパラメータに基づいています。

  • ファイルを暗号化してハッシュを計算し、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

おすすめ記事