string - Bash 在将字符串转换为参数时不解析引号

标签 string bash arguments spaces quoting

这是我的问题。在 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/

相关文章:

java - 如何在 Java 中将非常大的字符串转换为数字

Python将字符串添加到列表循环中

mysql - 如何将sql文件导入bash脚本

linux - 使用 bash 脚本比较两个文件并写入新文件

c - 如何在 C 中使用参数打印文本文件中的字符?

ios - 我想快速将 UIImage 与字符串进行编码和解码,以获取 AEXML 中的值

c++ - 将 char * 转换为 LPWSTR

c - 将转义的颜色字符打印到 bash

perl - 当调用的参数比预期的多时,子程序是否应该嘎嘎作响?

javascript - JavaScript `arguments` 是否包含 `this` ?