传递位置参数

传递位置参数

我对 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'

基本上我正在做这样的事情,我从 jenkins ui 获取这些值这些值是动态的

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

答案1

您必须在命令字符串之外定义位置参数:

 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可以更好地跟踪奇怪的行为。他们将在执行之前打印每个命令行。

相关内容