这是我的问题.在bash 3:
$test='One "This is two" Three' $set -- $test $echo $2 "This
如何获取bash以了解引号并返回$2,因为这是两个而不是“这个?不幸的是,我不能在这个例子中改变名为test的变量的构造.
原因是由于shell解析命令行的顺序:它解析(并删除)引号和转义,然后替换变量值.当$test被替换为“这是两个”的三个时候,报价已经太晚了.
$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的内容是“安全的”,不要使用这个结构.
BTW,这样做的正确方法是使用数组:
$test=(One "This is two" Three) $set -- "${test[@]}" $echo "$2" This is two
不幸的是,这需要控制变量的创建方式.