我正在调用带有两个参数的 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';'
但是,我需要使用所有三个参数 - %
from xargs
,以及在同一命令中调用脚本时的$1
and from 。关于执行此操作的适当方法有什么建议,或者不适合吗?$2
xargs
xargs
答案1
在:
cat test | xargs -I% bash -c 'echo % $1 $2;'
$1
并$2
作为参数中的文字字符串传递给bash -c
,即内联脚本。并且%
也会在该脚本中进行扩展,因此被视为 shell 代码。因此,例如,如果test
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
对输入进行一些引用处理,如果您希望逐字传递每行的原始内容,那么这不是您会使用的。使用 GNU xargs
,你可以这样做:
< test xargs -d '\n' -n 1 bash -c 'echo "$3" "$1" "$2"' bash "$1" "$2"
另外,不要忘记引用你的变量。printf
比 更可靠echo
,但请记住第一个参数是格式,所以不应该是多变的。