加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

当将字符串转换为参数时,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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读