【Shell秒懂系列】引用及转义(单引号/双引号/反斜杠/反引号)

10 篇文章 0 订阅
  1. Shell编程中主要以字符串实现数据传递,因此也赋予引号更多含义。为避免一些不必要的麻烦,你应当首先考虑使用双引号引用参数变量;
  2. 引号和转义是Shell中对字符串进行解析、扩展的主要手段。

引号释义

1. 单引号

去除字符串中的所有特殊含义,也即保持引号内的原始内容。

$ echo &  # 在后台执行echo
$ echo '&'  # 打印&
$ echo "$PATH"  # 打印系统环境变量
$ echo '$PATH'  # 防止变量名扩展,直接打印$PATH

2. 双引号

允许变量名扩展($var)、子进程($(command)`command`)和转义操作(\)。以下字符失去特殊含义:

  1. 作为argument分隔符的空格变为普通空格
  2. 具有强约束的单引号变为普通单引号字符
  3. 模型匹配特殊字符变为普通字符
  4. 扩展$HOME~特殊字符变为普通字符

相比于不带任何引号,双引号可以将可能存在的字符分割或扩展视作一个整体。

$ echo "$PATH"  # 打印变量PATH的值
$ echo "${PATH%%:*}"  # 仅输出第一条环境变量

注: 一个关于是否使用双引号而带来不同结果的例子:

files=$(find . -type f)

不使用双引号,echo $files的输出为

<file1> <files2> <file3> ...

原来find通过newline粉葛的输出结果被shell解释为空格。而使用双引号,echo "$files"的输出为:

<file1>
<file2>
<file3>
...

可以保持find的原本输出。由此例可以看出,在一般情形下应当保持使用双引号修饰变量的习惯,避免意料之外的输出结果。

3. 反引号

通过 `<command>`在子进程中执行命令,一般建议用$(command)替代,显式执行。

4. 反斜杠

转义,使特殊字符失去特殊含义。在没有引号或双引号内有效,在单引号中无效。

5. $’…’(ANSI C like strings)

比单引号的条件宽松,允许转义字符转义,具有移植性。例如,当需要在read prompt中使用在多行字符串时:

read -p "Please assign a new value to the LANG(=$LANG) variable: \n\tLANG=" LANG
echo $LANG

直接使用\n将无法转义。此时需引入$''字符串:

read -p "Please assign a new value to the LANG(=$LANG) variable: "$'\n\t'"LANG=" LANG
echo $LANG

如字符串中不需要变量扩张,则直接使用$''

read -p $'Somehow\na multiline prompt\nhere: '

也可以将包含转义的可复用字符作为变量调用:

newline=$'\n'
read -p "Somehow${newline}a multiline prompt${newline}here: "

参考

  1. BashFAQ - Quotes
  2. Quotes and escaping [Bash Hackers Wiki]
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值