当将字符串转换为参数时,Bash不会解析引号
发布时间:2020-12-16 01:29:37 所属栏目:安全 来源:网络整理
导读:这是我的问题.在bash 3: $test='One "This is two" Three'$set -- $test$echo $2"This 如何获取bash以了解引号并返回$2,因为这是两个而不是“这个?不幸的是,我不能在这个例子中改变名为test的变量的构造. 原因是由于shell解析命令行的顺序:它解析(并删除)
这是我的问题.在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 不幸的是,这需要控制变量的创建方式. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |