这是我的问题。在 bash 3 中:
$ test='One "This is two" Three'
$ set -- $test
$ echo $2
"This
如何让 bash 理解引号并将 $2 作为 This is two
而不是 "This
返回?不幸的是,我无法更改名为 的变量的构造在此示例中测试
。
最佳答案
发生这种情况的原因是 shell 解析命令行的顺序:它解析(并删除)引号和转义,然后替换变量值。当 $test
被替换为 One "This is two"Three
时,引号已经无法达到预期效果了。
实现此目的的简单(但危险)方法是使用 eval
添加另一层解析:
$ test='One "This is two" Three'
$ eval "set -- $test"
$ echo "$2"
This is two
(请注意,echo
命令中的引号不是必需的,但这是一个很好的通用做法。)
我说这很危险的原因是它不只是返回并重新解析引用的字符串,它返回并重新解析一切,可能包括你不想解释的东西,比如命令换人。假设你设置了
$ test='One `rm /some/important/file` Three'
...eval
实际上会运行 rm
命令。因此,如果您不能指望 $test
的内容是“安全的”,请不要使用此构造。
顺便说一句,做这种事情的正确方法是使用数组:
$ test=(One "This is two" Three)
$ set -- "${test[@]}"
$ echo "$2"
This is two
不幸的是,这需要控制变量的创建方式。
关于string - Bash 在将字符串转换为参数时不解析引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15857027/