暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Bash 波浪号和引号

阿枕日志 2021-11-08
376

bash 波浪号展开

echo ~        # OK
#> home/tom
echo ~/bin # OK
#> home/tom/bin

echo ~"/bin" # NOT OK
#> ~/bin

这里以第3条为例解析下 bash 中的「波浪号展开」(tilde expansion) 的过程:

  1. 找到一个以 未括住的波浪号 (unquoted tilde, ~
    ) 开头的 词 (word),即 ~"/bin"

  2. 将这个词中直到第一个 未括住的斜杠 (unquoted slash, /
    ) 之前的部分(没有未括住的斜杠时取整个词)视为 波浪号前缀 (tilde-prefix),即 ~"/bin"

  3. 如果波浪号前缀中没有一个 被括住 (quoted) 的字符,则视波浪号之后的部分为一个用户名 (login name),否则停止解析,故对于第3例而言,至此就停止解析了;

  4. 后续,若 login name 为空字符串,则替换为当前用户的主目录,否则替换为相应用户的主目录。

所以,第3例应改为:

echo ~/"bin"  # OK
#> home/tom/bin


bash 引号

Bash 中,引号机制 (quoting) 用于消除 特殊意义字符 的特殊意义,转而表示其字面意义。有三种引号,分别是 \
'
"

\
 仅作用于紧随其后的单一字符。特殊情况是 \<newline>
,被认为是一个 行继续 (line continuation)。

myVar=fox

echo \a\\ \$myVar
#> a\ $myVar

单引号字符串 ('…'
) 中,字符全部保留其字面意义,单引号本身不能出现在单引号字符串中。

echo '\a\\ $myVar'
#> \a\\ $myVar

双引号字符串 ("…"
) 中,$
`
\
 三个字符保留其特殊意义,且其中 \
 仅当作用于 $
`
"
\
<newline>
 这五个字符时才保有其特殊意义。也就是说,双引号自身可通过被反斜杠 (\
) 转义的形式而出现在双引号字符串中。

echo "\a\\ \"$myVar\""
#> \a\ "fox"

另外,$'…'
 形式的字符串中支持转义序列,如 \n
\r
\t
\xHH
\uHHHH
 等。

echo "a"$'\n'" $myVar"
#> a
#> fox


文章转载自阿枕日志,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论