如何动态切换管道的各个部分?

如何动态切换管道的各个部分?

我有一个脚本应该通过管道执行一系列命令。根据传递给脚本的参数:

  • 它要么加密文件,计算其哈希值,然后将其发送到 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管道就会捕获全部来自ifstmt 的标准输出。

这段代码(与您的代码类似,但更加简化)说明了这一点:

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

相关内容