Bash

傳遞位置參數

  • November 7, 2019

我對 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可以更好地跟踪奇怪的行為。他們將在執行之前列印每個命令行。

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