使用shell引用

使用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.

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!