高級Bash腳本編程指南: 一本深入學習shell腳本藝術的書籍 |
轉義是一種引用單個字符的方法.一個前面放上轉義符(\)的字符就是告訴shell這個字符按照字面的意思進行解釋,換句話說, 就是這個字符失去了它的特殊含義.
| 在某些特定的命令和工具中, 比如echo和sed, 轉義符往往會起到相反效果 - 它反倒可能會引發(fā)出這個字符的特殊含義. |
特定的轉義符的特殊的含義
- echo和sed命令中使用
- \n
表示新的一行
- \r
表示回車
- \t
表示水平制表符
- \v
表示垂直制表符
- \b
表示后退符
- \a
表示"alert"(蜂鳴或者閃爍)
- \0xx
轉換為八進制的ASCII碼, 等價于0xx
例子 5-2. 轉義符
1 #!/bin/bash 2 # escaped.sh: 轉義符 3 4 echo; echo 5 6 echo "\v\v\v\v" # 逐字的打印\v\v\v\v. 7 # 使用-e選項的'echo'命令來打印轉義符. 8 echo "=============" 9 echo "VERTICAL TABS" 10 echo -e "\v\v\v\v" # 打印4個垂直制表符. 11 echo "==============" 12 13 echo "QUOTATION MARK" 14 echo -e "\042" # 打印" (引號, 8進制的ASCII 碼就是42). 15 echo "==============" 16 17 # 如果使用$'\X'結構,那-e選項就不必要了. 18 echo; echo "NEWLINE AND BEEP" 19 echo $'\n' # 新行. 20 echo $'\a' # 警告(蜂鳴). 21 22 echo "===============" 23 echo "QUOTATION MARKS" 24 # 版本2以后Bash允許使用$'\nnn'結構. 25 # 注意在這里, '\nnn\'是8進制的值. 26 echo $'\t \042 \t' # 被水平制表符括起來的引號("). 27 28 # 當然,也可以使用16進制的值,使用$'\xhhh' 結構. 29 echo $'\t \x22 \t' # 被水平制表符括起來的引號("). 30 # 感謝, Greg Keraunen, 指出了這點. 31 # 早一點的Bash版本允許'\x022'這種形式. 32 echo "===============" 33 echo 34 35 36 # 分配ASCII字符到變量中. 37 # ---------------------------------------- 38 quote=$'\042' # " 被賦值到變量中. 39 echo "$quote This is a quoted string, $quote and this lies outside the quotes." 40 41 echo 42 43 # 變量中的連續(xù)的ASCII字符. 44 triple_underline=$'\137\137\137' # 137是八進制的'_'. 45 echo "$triple_underline UNDERLINE $triple_underline" 46 47 echo 48 49 ABC=$'\101\102\103\010' # 101, 102, 103是八進制碼的A, B, C. 50 echo $ABC 51 52 echo; echo 53 54 escape=$'\033' # 033 是八進制碼的esc. 55 echo "\"escape\" echoes as $escape" 56 # 沒有變量被輸出. 57 58 echo; echo 59 60 exit 0 |
參考例子 34-1,這是關于$' '字符串擴展結構的一個例子.
- \"
表示引號字面的意思
1 echo "Hello" # Hello 2 echo "\"Hello\", he said." # "Hello", he said. |
- \$
表示$本身子面的含義(跟在\$后邊的變量名將不能引用變量的值)
1 echo "\$variable01" # 結果是$variable01 |
- \\
表示反斜線字面的意思
1 echo "\\" # 結果是\ 2 3 # 反之 . . . 4 5 echo "\" # 如果從命令行調(diào)用的話, 會出現(xiàn)SP2, 也就是2級提示符(譯者注: 提示你命令不全, 在添加一個"就好了. 6 # 如果在腳本中調(diào)用的話, 那么會報錯. |
| \的行為依賴于它自身是否被轉義, 被引用(""), 或者是否出現(xiàn)在命令替換或here document中. 1 # 簡單的轉義和引用 2 echo \z # z 3 echo \\z # \z 4 echo '\z' # \z 5 echo '\\z' # \\z 6 echo "\z" # \z 7 echo "\\z" # \z 8 9 # 命令替換 10 echo `echo \z` # z 11 echo `echo \\z` # z 12 echo `echo \\\z` # \z 13 echo `echo \\\\z` # \z 14 echo `echo \\\\\\z` # \z 15 echo `echo \\\\\\\z` # \\z 16 echo `echo "\z"` # \z 17 echo `echo "\\z"` # \z 18 19 # Here document 20 cat <<EOF 21 \z 22 EOF # \z 23 24 cat <<EOF 25 \\z 26 EOF # \z 27 28 # 這些例子是由Stephane Chazelas所提供的. | 賦值給變量的字符串的元素也會被轉義, 但是不能把一個單獨的轉義符賦值給變量. 1 variable=\ 2 echo "$variable" 3 # 不能正常運行 - 會報錯: 4 # test.sh: : command not found 5 # 一個"裸體的"轉義符是不能夠安全的賦值給變量的. 6 # 7 # 事實上在這里"\"轉義了一個換行符(變成了續(xù)航符的含義), 8 #+ 效果就是 variable=echo "$variable" 9 #+ 不可用的變量賦值 10 11 variable=\ 12 23skidoo 13 echo "$variable" # 23skidoo 14 # 這句是可以的, 因為 15 #+ 第2行是一個可用的變量賦值. 16 17 variable=\ 18 # \^ 轉義一個空格 19 echo "$variable" # 顯示空格 20 21 variable=\\ 22 echo "$variable" # \ 23 24 variable=\\\ 25 echo "$variable" 26 # 不能正常運行 - 報錯: 27 # test.sh: \: command not found 28 # 29 # 第一個轉義符把第2個\轉義了,但是第3個又變成"裸體的"了, 30 #+ 與上邊的例子的原因相同. 31 32 variable=\\\\ 33 echo "$variable" # \\ 34 # 第2和第4個反斜線被轉義了. 35 # 這是正確的. | |
轉義一個空格會阻止命令行參數(shù)列表的"單詞分割"問題.
1 file_list="/bin/cat /bin/gzip /bin/more /usr/bin/less /usr/bin/emacs-20.7" 2 # 列出的文件都作為命令的參數(shù). 3 4 # 加兩個文件到參數(shù)列表中, 列出所有的文件信息. 5 ls -l /usr/X11R6/bin/xsetroot /sbin/dump $file_list 6 7 echo "-------------------------------------------------------------------------" 8 9 # 如果我們將上邊的兩個空個轉義了會產(chǎn)生什么效果? 10 ls -l /usr/X11R6/bin/xsetroot\ /sbin/dump\ $file_list 11 # 錯誤: 因為前3個路徑被合并成一個參數(shù)傳遞給了'ls -l' 12 # 而且兩個經(jīng)過轉義的空格組織了參數(shù)(單詞)分割. |
轉義符也提供續(xù)行功能, 也就是編寫多行命令的功能.一般的, 每一個單獨行都包含一個不同的命令,但是每行結尾的轉義符都會轉義換行符,這樣下一行會與上一行一起形成一個命令序列.
1 (cd /source/directory && tar cf - . ) | \ 2 (cd /dest/directory && tar xpvf -) 3 # 重復Alan Cox的目錄數(shù)拷貝命令, 4 # 但是分成兩行是為了增加可讀性. 5 6 # 也可以使用如下方式: 7 tar cf - -C /source/directory . | 8 tar xpvf - -C /dest/directory 9 # 察看下邊的注意事項. 10 # (感謝, Stephane Chazelas.) |
| 如果一個腳本以|結束, 管道符, 那么就不用非的加上轉義符\了. 但是一個好的編程風格, 還是應該在行尾加上轉義符. |
1 echo "foo
2 bar"
3 #foo
4 #bar
5
6 echo
7
8 echo 'foo
9 bar' # 沒什么區(qū)別.
10 #foo
11 #bar
12
13 echo
14
15 echo foo\
16 bar # 換行符被轉義.
17 #foobar
18
19 echo
20
21 echo "foo\
22 bar" # 與上邊一樣, \在部分引用中還是被解釋為續(xù)行符.
23 #foobar
24
25 echo
26
27 echo 'foo\
28 bar' # 由于是全引用, 所以\沒有被解釋成續(xù)行符.
29 #foo\
30 #bar
31
32 # 由Stephane Chazelas所建議的用例.
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請
點擊舉報。