파이프라인의 일부를 동적으로 전환하는 방법은 무엇입니까?

파이프라인의 일부를 동적으로 전환하는 방법은 무엇입니까?

파이프를 통해 일련의 명령을 실행하는 스크립트가 있습니다. 스크립트에 전달된 매개변수를 기반으로 합니다.

  • 파일을 암호화하고 해시를 계산한 후 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파이프가 캡처됩니다.모두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

관련 정보