我想要实现的是从文件中读取命令行参数并使用它们调用命令。所以基本上我需要通过bash变量传递参数。问题是一些参数中有空格。我怎么能这样做?
不工作代码,以说明问题:
file.txt内容(引号只是为了显示两个不同的参数):
"aaa bbb" "xxx yyy"
shell脚本:
ARGS=$(cat file.txt)
/some/command $ARGS
/some/command
应该收到两个参数:aaa bbb
和xxx yyy
。我确实控制了生成的file.txt和shell脚本本身。
答案 0 :(得分:3)
如果你想为file.txt
中找到的每一行执行一次命令,那么每一行都是一个单独的参数集,你可以这样做:
xargs /some/command <file.txt
xargs
实用程序获取它在标准输入上接收的每一行,并使用其内容作为参数提供给被调用的命令。如果文件只包含一行,它将起作用并只执行一次命令。
以下解决方案也是如此,但也适用于函数:
while IFS= read -r line
do
eval args=\("$line"\)
command_or_function "${args[@]}"
done<file.txt
请注意,这使用eval
,这意味着如果file.txt
包含恶意内容,则可能导致任意代码执行。您必须100%确定文件中包含的数据是安全的。
使用这种技术的想法是你将每一行分解为一个数组(一个数组元素是一个参数),然后使用数组扩展("${args[@]}"
)扩展到其所有元素的列表,正确引用(扩展的引号在这里很重要)。
另外,eval
行可以替换为:
declare -a args=\($line\)
但$line
仍在扩展,因此这并不比eval
更安全。
答案 1 :(得分:1)
使用命令替换,将文件内容扩展为命令
/some/command "$(<file.txt)"
举个例子,
cat file
"aaa bbb" "xxx yyy"
使用printf
INCORRECTLY 与cat
将产生
printf "%s\n" $(cat file)
"aaa
bbb"
"xxx
yyy"
如果存在适当的引用,则参数将被发送,而不会被分割。
printf "%s\n" "$(<file)"
"aaa bbb" "xxx yyy"