使用shell引用,你需要了解一些使用命令行引用的经验法则。
解决方案
将字符串放进单引号中,除非字符串中包含需要 shell 进行插值的元素。
讨论
shell 会对非引用文本以及双引号中的文本执行扩展和替换操作。思考以下示例:
$ echo A coffee is $5?!
A coffee is ?!
$ echo "A coffee is $5?!"
-bash: !": event not found
$ echo 'A coffee is $5?!'
A coffee is $5?!
- 第一个例子要对 $5 进行变量扩展,但因为该变量并不存在,所以扩展结果为空。
- 第二个例子要遵循同样的规则,但我们没有看到任何命令输出,这是因为对 ! 进行历史替换时失败了,原因是其不匹配任何历史记录。
- 第三个例子的结果符合我们的预期。
要想将 shell 扩展与字符串字面量混合在一起,可以利用 shell 转义字符或修改引用方式。惊叹号是一种特殊情况,放在其之前的反斜线转义字符不会被删除。可以通过单引号或尾部空格解决这个问题,如下所示:
$ echo 'A coffee is $5 for' "$USER" '?!'
A coffee is $5 for jp ?!
$ echo "A coffee is \$5 for $USER?\!"
A coffee is $5 for jp?\!
$ echo "A coffee is \$5 for $USER?! "
A coffee is $5 for jp?!
另外,你无法在一对单引号中再嵌入另一个单引号,使用反斜线也不行,因为单引号内不会执行任何插值操作。解决方法有两种:使用双引号以及转义字符,或者在单引号对之外转义单引号。
# 我们会得到一个示意继续输入的提示符,因为目前的引号并不对称
$ echo '$USER won't pay $5 for coffee.'
> ^C
# 错误
$ echo "$USER won't pay $5 for coffee."
jp won't pay for coffee.
# 有效
$ echo "$USER won't pay \$5 for coffee."
jp won't pay $5 for coffee.
# 同样有效
$ echo 'I won'\''t pay $5 for coffee.'
I won't pay $5 for coffee.
酷客网相关文章:
评论前必须登录!
注册