我想将标记 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"
但如何?
首先,您不要这样做,
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
or$(shutdown)
怎么办?这就像嵌入{}
。不。如果您想提供一些值,请将其作为参数提供给
sh
自身:第二个
sh
在这里解释:什么是第二个 sh insh -c 'some shell code' sh
?单引号保护$1
,$2
并且$3
不被当前 shell 扩展。sh
获得与单引号内完全相同的 shell 代码:echo "$1 - $2 - $3"
. 任意字符串作为参数传递,仅由 扩展sh
,不存在代码注入漏洞。我觉得这就是 :