当将字符串转换为参数时,Bash不会解析引号

前端之家收集整理的这篇文章主要介绍了当将字符串转换为参数时,Bash不会解析引号前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这是我的问题.在bash 3:
$test='One "This is two" Three'
$set -- $test
$echo $2
"This

如何获取bash以了解引号并返回$2,因为这是两个而不是“这个?不幸的是,我不能在这个例子中改变名为test的变量的构造.

原因是由于shell解析命令行的顺序:它解析(并删除)引号和转义,然后替换变量值.当$test被替换为“这是两个”的三个时候,报价已经太晚了.

简单(但危险)的方法是通过添加另一个级别的解析与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的内容是“安全的”,不要使用这个结构.

BTW,这样做的正确方法是使用数组:

$test=(One "This is two" Three)
$set -- "${test[@]}"
$echo "$2"
This is two

不幸的是,这需要控制变量的创建方式.

猜你在找的Bash相关文章