Xargs
xargs 忽略第二個腳本參數
我正在呼叫帶有兩個參數的 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';'
但是,我需要使用所有三個參數 -
%
fromxargs
,以及在同一命令中呼叫腳本時的$1
and from 。有關執行此操作的適當方法的任何建議,還是不適合此操作?$2``xargs``xargs
在:
cat test | xargs -I% bash -c 'echo % $1 $2;'
$1
並$2
在參數中作為文字字元串傳遞給bash -c
,即內聯腳本。並且%
也會在那個腳本中展開,所以被當作shell程式碼。因此,例如 iftest
contains;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
,如果您希望逐字傳遞每行的原始內容,則對輸入進行一些引用處理,這不是您將使用的。使用 GNUxargs
,您可以:< test xargs -d '\n' -n 1 bash -c 'echo "$3" "$1" "$2"' bash "$1" "$2"
另外,不要忘記引用您的變數。
printf
比更可靠echo
,但記住第一個參數是格式,所以不應該是可變的。