命令替换使用空格中断引用的参数

时间:2017-03-10 21:27:50

标签: bash command-line-arguments command-substitution

如下所示,命令替换更改了引用的命令行参数的解释。引擎盖下发生了什么,是否有解决方法?

$ cat dumpargs.sh
#! /usr/bin/env bash
for i in "$@"
   {
   echo "$i"
   }

$ cat testfile.txt 
'1 space' '2  space'

$ ./dumpargs.sh $(cat testfile.txt) ## produced undesired output
'1
space'
'2
space'

$ ./dumpargs.sh '1 space' '2  space' ## produces desired output
1 space
2  space

1 个答案:

答案 0 :(得分:2)

当您在命令行上编写./dumpargs.sh '1 space' '2 space'时,shell会在将参数传递给脚本之前解释单引号。参数#1将具有值1 space,参数#2将具有值2 space。单引号不是值的一部分。

当你写./dumpargs.sh $(cat testfile.txt)时, shell不会尝试解释testfile.txt的内容。 shell仅解释在命令行上输入的实际文本。 像这个例子的替换内容,或者例如变量的值不被解释,而是按字面意思使用。 最后,shell使用IFS中的分隔符对命令行上的字符串执行分词。 所以单引号将按字面意思使用, 并且内容只是由空格分割。

一种可能的解决方法是每行存储一个参数,不带单引号,make dumpargs.sh从标准输出中获取参数:

while read -r line; do
    echo "$line"
done

您可以使用./dumpargs.sh < testfile.txt调用它。