如下所示,命令替换更改了引用的命令行参数的解释。引擎盖下发生了什么,是否有解决方法?
$ 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
答案 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
调用它。