簡體   English   中英

bash中如何有條件地添加管道元素

[英]How to conditionally add a pipeline element in bash

我需要形成各種命令的管道。 管道的某些元素或元素序列僅在某些條件成立時才相關。 現在,我可以寫:

if [[ $whatever ]]; then
   cmd1 | cmd2 | cmd3 | cmd4
else
   cmd1 | cmd4
fi

但這意味着重復cmd1cmd4 ,另外,可能有幾個條件,我不想寫嵌套的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM