xargs 忽略第二个脚本参数

xargs 忽略第二个脚本参数

我正在调用带有两个参数的 bash 脚本,我们将它们称为param_oneparam_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 。关于执行此操作的适当方法有什么建议,或者不适合吗?$2xargsxargs

答案1

在:

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

$1$2作为参数中的文字字符串传递给bash -c,即内联脚本。并且%也会在该脚本中进行扩展,因此被视为 shell 代码。因此,例如,如果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,但请记住第一个参数是格式,所以不应该是多变的

相关内容