Shell-Script
條件管道
假設我有以下管道:
cmd1 < input.txt |\ cmd2 |\ cmd4 |\ cmd5 |\ cmd6 |\ (...) |\ cmdN > result.txt
在某些情況下,我想添加一個
cmd3
betweencmd2
andcmd4
。有沒有辦法創建一種條件管道而不將結果保存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