0

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

$ 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
4

1 回答 1

2

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

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

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

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

你可以用./dumpargs.sh < testfile.txt.

于 2017-03-10T21:44:41.493 回答