Shell-Script

條件管道

  • August 14, 2020

假設我有以下管道:

cmd1 < input.txt |\
cmd2 |\
cmd4 |\
cmd5 |\
cmd6 |\
(...) |\
cmdN > result.txt

在某些情況下,我想添加一個cmd3between cmd2and cmd4。有沒有辦法創建一種條件管道而不將結果保存cmd2到臨時文件中?我會想到類似的東西:

cmd1 < input.txt |\
cmd2 |\
(${DEFINED}? cmd3 : cat ) |\
cmd4 |\
cmd5 |\
cmd6 |\
(...) |\
cmdN > result.txt

只是通常的&&||運算符:

cmd1 < input.txt |
cmd2 |
( [ -n "$DEFINED" ] && cmd3 || cat ) |
cmd4 |
cmd5 |
cmd6 |
(...) |
cmdN > result.txt

雖然,正如這個答案if ... else所指定的,如果您使用 if-else 語法,您通常更喜歡:

 ...
 cmd2 |
 if [ -n "$DEFINED" ]; then cmd3; else cat; fi |
 cmd4 |
 ...

(請注意,當行以管道結尾時,不需要尾部反斜杠。)

根據喬納斯的觀察更新

如果 cmd3 可能以非零退出程式碼終止並且您不想cat處理剩餘的輸入,請反轉邏輯:

cmd1 < input.txt |
cmd2 |
( [ -z "$DEFINED" ] && cat || cmd3 ) |
cmd4 |
cmd5 |
cmd6 |
(...) |
cmdN > result.txt

引用自:https://unix.stackexchange.com/questions/38310