共计 1475 个字符,预计需要花费 4 分钟才能阅读完成。
引用的意思是用引号括起一个字符串,以保护字符串中的特殊字符不被 shell 或 shell 脚本重新解释或扩展:
# 在通配和正则模式中拥有特殊含义的 * 号在引用中失去了特殊意义
bash$ ls -l [Vv]*
-rw-rw-r-- 1 bozo bozo 324 Apr 2 15:05 VIEWDATA.BAT
-rw-rw-r-- 1 bozo bozo 507 May 4 14:25 vartrace.sh
-rw-rw-r-- 1 bozo bozo 539 Apr 14 17:11 viewdata.sh
bash$ ls -l '[Vv]*'
ls: [Vv]*: No such file or directory
但某些程序会重新解释或扩展引号括起的字符串中的特殊字符。比如某些场景下引号的用途是保护 shell 命令参数,但仍然允许调用程序扩展特殊字符:
bash$ cat file1.txt
first name in file1.txt
bash$ cat file2.txt
First name in file2.txt
bash$ grep '[Ff]irst name' *.txt
file1.txt:first name in file1.txt
file2.txt:First name in file2.txt
引用变量
引用变量时,通常建议用双引号括起。这可以防止重新解释引用字符串中除 $
, `
, \
外的所有特殊字符。
使用双引号可以防止单词拆分,用双引号括起的参数即使包含空格也将视为一个整体:
List="one two three"
for a in $List # 空格拆分变量为多个部分
do
echo "$a"
done
# one
# two
# three
echo "---"
for a in "$List" # 双引号括起变量视为一个整体
do
echo "$a"
done
# one two three
一个更详细的例子:
variable1="a variable containing five words"
# 以 7 个参数执行 echo 指令
# "This" "is" "a" "variable" "containing" "five" "words"
echo This is $variable1
# 以 1 个参数执行 echo 指令
# "This is a variable containing five words"
echo "This is $variable1"
variable2=""
# 以 0 个参数执行 echo 指令
echo $variable2 $variable2 $variable2
# 以 3 个参数执行 echo 指令(3 个空字符串)
echo "$variable2" "$variable2" "$variable2"
# 以 1 个参数执行 echo 指令(2 个空格)
echo "$variable2 $variable2 $variable2"
只有存在单词拆分和空格字符保留的问题时,echo 指令用双引号括起参数才是必要的。
单引号引用 ( 强引用
) 和双引号引用 ( 弱引用
) 类似,但禁用了 $
的特殊含义,因此不能引用变量,不止如此,实际上除了 '
以外的所有特殊字符都将只表示其字面含义。
转义
转义是一种引用单个字符的方法,字符前导的转义符 \
告诉 shell 解释该字符的字面含义。
某些指令如 echo
, sed
,对字符转义可能拥有相反的效果,它会触发该字符的特殊含义。例如:\n
表示换行符 \r
表示回车符 \t
表示制表符 \v
表示垂直制表符 \b
表示退格符 \a
表示 beep 响铃 \0xx
表示等效的 ASCII 字符,其中 xx 为一串数字。
$'...'
形式的字符串扩展结构是一种使用转义八进制或十六进制值分配 ASCII 字符给变量的机制。
# 使用 $'\X' 构造形式可以省略 - e 选项
echo -e "\n"
echo $'\n' # 打印换行符
正文完