我想将标记 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 中设置这些,它仍然不是一个很好的通用方法,因为扩展的结果将是解释以sh
shell 代码的形式执行。除非您希望将其解释为 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"'