Xargs

xargs 忽略第二個腳本參數

  • November 7, 2019

我正在呼叫帶有兩個參數的 bash 腳本,我們將它們param_one稱為param_two. 我還有一個名為的文件test,其中包含兩行:

line_one
line_two

這是我的腳本的樣子:

cat test | xargs -I% bash -c 'echo % $1 $2;'

我正在尋找的輸出是

line_one param_one param_two
line_two param_one param_two

但我不斷得到這個:

line_one
line_two

xargs當我在腳本中有多個參數時忽略。即使我將腳本更改為此它也只會列印param_oneparam_one

cat test | xargs -I% bash -c 'printf '$1 $2';'

但是,我需要使用所有三個參數 - %from xargs,以及在同一命令中呼叫腳本時的$1and from 。有關執行此操作的適當方法的任何建議,還是不適合此操作?$2``xargs``xargs

在:

cat test | xargs -I% bash -c 'echo % $1 $2;'

$1$2在參數中作為文字字元串傳遞給bash -c,即內聯腳本。並且%也會在那個腳本中展開,所以被當作shell程式碼。因此,例如 if testcontains ;reboot;,這將使它呼叫reboot命令。

您沒有將參數傳遞給該內聯腳本,因此$1,$2將為空。

你可以這樣做:

< test xargs -I% bash -c 'echo "$1" "$2" "$3"' bash % "$1" "$2"

要將腳本的參數轉發到內聯腳本,但如果$1$2恰好包含%字元,它們也會xargs在那裡擴展。

所以你可以使用環境來傳遞這些值:

< test PARAM1=$1 PARAM2=$2 xargs -I% bash -c '
 echo "$1" "$PARAM1" "$PARAM2"' bash %

另請注意xargs,如果您希望逐字傳遞每行的原始內容,則對輸入進行一些引用處理,這不是您將使用的。使用 GNU xargs,您可以:

< test xargs -d '\n' -n 1 bash -c 'echo "$3" "$1" "$2"' bash "$1" "$2"

另外,不要忘記引用您的變數。printf比更可靠echo,但記住第一個參數是格式,所以不應該是可變的。

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