Bash指令碼程式設計之引用
引用的意思是用引號括起一個字串,以保護字串中的特殊字元不被shell或shell指令碼重新解釋或擴充套件:
# 在通配和正則模式中擁有特殊含義的*號在引用中失去了特殊意義 bash$ ls -l [Vv]* -rw-rw-r--1 bozobozo324 Apr2 15:05 VIEWDATA.BAT -rw-rw-r--1 bozobozo507 May4 14:25 vartrace.sh -rw-rw-r--1 bozobozo539 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'# 列印換行符