![파이프라인의 일부를 동적으로 전환하는 방법은 무엇입니까?](https://linux55.com/image/176107/%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B8%EC%9D%98%20%EC%9D%BC%EB%B6%80%EB%A5%BC%20%EB%8F%99%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EC%A0%84%ED%99%98%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
파이프를 통해 일련의 명령을 실행하는 스크립트가 있습니다. 스크립트에 전달된 매개변수를 기반으로 합니다.
- 파일을 암호화하고 해시를 계산한 후 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