如何通过bash中的变量传递带空格的命令行参数

时间:2017-02-08 11:07:18

标签: bash shell

我想要实现的是从文件中读取命令行参数并使用它们调用命令。所以基本上我需要通过bash变量传递参数。问题是一些参数中有空格。我怎么能这样做?

不工作代码,以说明问题:

file.txt内容(引号只是为了显示两个不同的参数):

"aaa bbb" "xxx yyy"

shell脚本:

ARGS=$(cat file.txt)
/some/command $ARGS

/some/command应该收到两个参数:aaa bbbxxx yyy。我确实控制了生成的file.txt和shell脚本本身。

2 个答案:

答案 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"