bash 波浪号展开
echo ~ # OK
#> home/tom
echo ~/bin # OK
#> home/tom/bin
echo ~"/bin" # NOT OK
#> ~/bin
这里以第3条为例解析下 bash 中的「波浪号展开」(tilde expansion) 的过程:
找到一个以 未括住的波浪号 (unquoted tilde,
~
) 开头的 词 (word),即~"/bin"
;将这个词中直到第一个 未括住的斜杠 (unquoted slash,
/
) 之前的部分(没有未括住的斜杠时取整个词)视为 波浪号前缀 (tilde-prefix),即~"/bin"
;如果波浪号前缀中没有一个 被括住 (quoted) 的字符,则视波浪号之后的部分为一个用户名 (login name),否则停止解析,故对于第3例而言,至此就停止解析了;
后续,若 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




