如何使用 xargs 将参数作为 $1、$2、$3 等传递给使用 sh -c 调用的内联脚本?

如何使用 xargs 将参数作为 $1、$2、$3 等传递给使用 sh -c 调用的内联脚本?

我想将标记 abc 作为脚本的参数传递,该脚本将输出 a - b - c。如果我有一个脚本和一个包含dummy.sh以下内容的文件:echo "$1 - $2 - $3"dummy.dat

a b c
d e f

我想输出

a - b - c
d - e - f

我可以做类似的事情:

cat dummy.dat | xargs -Iline sh -c "sh dummy.sh line"
cat dummy.dat | xargs -n3 sh dummy.sh

但是如果我不想要单行脚本,我只能使用吗,sh -c "echo $1 - $2 - $3"但是如何使用?

答案1

首先,你不要这样做,sh -c "echo $1 - $2 - $3"因为双引号会导致你当前的 shell 扩展$1,$2$3。即使你设法事先在当前 shell 中设置这些,它仍然不是一个很好的通用方法,因为扩展的结果将是解释shshell 代码的形式执行。除非您希望将其解释为 shell 代码,否则请不要这样做。

xargs -Iline sh -c "sh dummy.sh line"也有类似的缺陷:line将被外部的 解释sh。如果它碰巧是; rm -f /important/file或怎么办$(shutdown)?就像嵌入{}。 不。

如果您想提供一些值,请将其作为参数提供sh

<dummy.dat xargs -n3 sh -c 'echo "$1 - $2 - $3"' sh

第二个sh解释如下:中的第二个 sh 是什么sh -c 'some shell code' sh单引号保护$1$2$3不被当前 shell 扩展。sh获取单引号内的 shell 代码:echo "$1 - $2 - $3"。 任意字符串作为参数传递,仅由 扩展sh,不存在代码注入漏洞。

答案2

我觉得这就是 :

cat dummy.dat | xargs -n3 sh -c 'echo "$0 - $1 - $2"'

相关内容