[英]How to conditionally add a pipeline element in bash
我需要形成各種命令的管道。 管道的某些元素或元素序列僅在某些條件成立時才相關。 現在,我可以寫:
if [[ $whatever ]]; then
cmd1 | cmd2 | cmd3 | cmd4
else
cmd1 | cmd4
fi
但這意味着重復cmd1
和cmd4
,另外,可能有幾個條件,我不想寫嵌套的 if 。 所以,我試着寫這個:
if [[ $whatever ]]; then
pipeline_segment="| cmd2 | cmd3"
else
pipeline_segment=""
fi
cmd1 ${pipeline_segment} | cmd4
但是 - pipe 符號未被解釋為使用 pipe 的指令。
我如何讓 bash 執行我想要的管道?
注意:您可以假設 bash 版本為 4 或更高版本,但前提是您必須這樣做。
您的嘗試失敗了,因為特殊符號在擴展后失去了它們的語法價值。 eval
是一種方法,但我們知道它很容易發生代碼注入,因此最好避免。 我們能試試
cmd1 |
if [ condition ]; then
cmd2 | cmd3
else
cat
fi |
cmd4
雖然我很想跳過cat
,但我找不到辦法。 真實例子:
echo XYZABC |
if true; then
tr Y B | tr Z C
else
cat
fi |
tr X A
輸出ABCABC
並將條件更改為false
輸出AYZABC
。
我想你不想重復任何事情,因為它們是大而粗糙的命令。 在這種情況下,使用函數來封裝它們:
cmd1() { some big long command with many options and arguments; }
cmd2() { similar; }
... and so on
你可以從字面上使用這個
if [[ $whatever ]]; then
cmd1 | cmd2 | cmd3 | cmd4
else
cmd1 | cmd4
fi
或者,將whatever
條件推送到函數中:
cmd2 () {
if [[ whatever ]]; then
the big long command
else
cat
fi
}
cmd3() {
if [[ whatever ]]; then
the other big long command
else
cat
fi
}
然后,你只剩下簡單的
cmd1 | cmd2 | cmd3 | cmd4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.