Bash
傳遞位置參數
我對 xargs 很陌生
我有一個命令
kubectl taint nodes xx.xx.xx.xx dedicated=test:NoSchedule --overwrite=true
我有我的命令,如何將位置值傳遞給 xargs?他們沒有通過。
echo \$NODES \$key_and_value \$overwrite \$label | xargs -I -l % sh -c 'kubectl taint nodes \$0 % \$1 --overwrite=\$2'
基本上我正在做這樣的事情,我從詹金斯使用者界面獲取這些值這些值是動態的
echo \$NODES \$key_and_value \$overwrite | xargs -I% bash -c 'kubectl --kubeconfig ./kube-configs/config \ taint nodes % "\$0" "\$1" --overwrite=% "\$2"'`
錯誤 :
16:06:42 Error: invalid argument "ip-xx-xx-xx-xx.ec2.internal" for "--overwrite" flag: strconv.ParseBool: parsing "ip-xx-xx-xx-xx.ec2.internal": invalid syntax
您必須在命令字元串之外定義位置參數:
echo a b c d | xargs -I VALUES sh -c "echo \$4 \$3 \$2 \$1" command VALUES
這沒有很好的描述(在我的情況下來自
man dash
)-C
從 command_string 操作數而不是從標準輸入讀取命令。特殊參數 0 將從 command_name 操作數和位置參數 ( $ 1, $ 2等)從剩餘的參數操作數中設置。
但表現得更好
man bash
:-C
如果存在 -c 選項,則從第一個非選項參數 command_string 中讀取命令。如果在 command_string 之後有參數,則第一個參數分配給 $0 並且任何剩餘的參數分配給位置參數。對 $0 的賦值設置了 shell 的名稱,該名稱用於警告和錯誤消息。
請注意,command_string 設置為引號 (=
$0
)中的命令字元串之後的第一個參數在您的情況下,您使用了
-I
不帶參數的選項,這意味著xargs
讀取的值不僅是附加的,而且需要通過呼叫'{}'
。所以要麼使用這個:echo 1 2 3 4 | xargs sh -c "echo \$4 \$3 \$2 \$1" command
或這個
echo 1 2 3 4 | xargs -I sh -c "echo \$4 \$3 \$2 \$1" command '{}'
提示:使用
-x
選項 fromsh
和-t
選項 fromxargs
可以更好地跟踪奇怪的行為。他們將在執行之前列印每個命令行。