文章目錄
- 一、舉例—單、雙引號引用變量的結果差異
- 二、使用雙引號引用變量的場景
- 1、使用雙引號—可以防止字符串被分割
- 2、使用雙引號—特殊字符變為普通字符
- 3、使用雙引號—保存原始命令的輸出格式
- 4、使用雙引號—具有強約束的單引號變為普通單引號字符
- 5、注意
一、舉例—單、雙引號引用變量的結果差異
1、運行下面代碼:
time_tag="2022050912"
outFileName='newnbr_raoming_model.${time_tag}.txt'
echo $time_tag,$outFileName
運行結果:
2022050912,newnbr_raoming_model.${time_tag}.txt
觀察運行結果,可以發現outFileName變量中引用的time_tag變量名沒有賦值2022050912,而是直接輸出了,這不是我們想要的。
time_tag="2022050912"
outFileName="newnbr_raoming_model.${time_tag}.txt"
echo $time_tag,$outFileName
2、解決方法:引用outFileName變量時,將單引號變成雙引號,發現outFileName變量中引用的time_tag變量名成功賦值為2022050912。
time_tag="2022050912"
outFileName="newnbr_raoming_model.${time_tag}.txt"
echo $time_tag,$outFileName
運行結果:
2022050912,newnbr_raoming_model.2022050912.txt
3、原因:單引號(’ ')與雙引號類似,但是單引號中不能引用變量,因為$不再具有特殊含義。在單引號中,除 '(單引號)之外的所有特殊字符都將會被直接按照字面意思解釋。可以認為單引號(全引用)是雙引號(部分引用)的一種更嚴格的形式。
二、使用雙引號引用變量的場景
引用變量時,通常建議將變量包含在雙引號中,這樣可以防止除 $,`(反引號),\ (轉義符)之外的其他特殊字符被重新解釋。(在雙引號之中, $代表引用變量的值,而 ` (反引號)代表引用命令,\ (轉義符)可以保留字符字面輸出,主要針對$、`、\ 這三個在雙引號有特殊含義的字符。)
1、使用雙引號—可以防止字符串被分割
舉例1:
運行下面代碼:
List="one two three"for a in $List #空白符將變量分成幾個部分
do echo $a
done
運行結果:
one
two
three
空白符將變量分成幾個部分。
將變量加上雙引號,運行下面代碼:
List="one two three"for a in "$List" #在單一變量中保留所有空格
do echo $a
done
運行結果:
one two three
2、使用雙引號—特殊字符變為普通字符
舉例1:
運行下面代碼:
#!/bin/bash
# test.sh: 輸出一些奇怪的變量var="'(]\\{}\$\""
echo $var
echo "$var"
運行結果:
'(]\{}$"
'(]\{}$"
echo $var 與echo “$var” 的運行結果沒有區別。
舉例2:
運行下面代碼:
IFS='\' #定義分隔符
var="'(]\\{}\$\""
echo $var
echo "$var"
運行結果:
'(] {}$"
'(]\{}$"
echo $var 的運行結果中 \ 直接被轉換成空格了,echo “$var” 的運行結果沒有任何區別。
舉例3:
運行下面代碼:
var1="Have I Told You Lately That I Love You"
echo "\$var1 = "$var1""
運行結果:
$var1 = Have I Told You Lately That I Love You
雙引號中,單獨的$表示引用變量,如果$想要單純按照字面意思輸出,加上轉義符號(\)。
3、使用雙引號—保存原始命令的輸出格式
舉例1:
運行下面代碼:
echo "$(echo '"')"
運行結果:
"
舉例2:
運行下面代碼:
echo $(cal)
echo "$(cal)"
運行結果:
July 2024 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31July 2024
Su Mo Tu We Th Fr Sa1 2 3 4 5 67 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
如果$(cal)不放在雙引號之中,echo就會將所有結果以單行輸出,丟棄了所有原始的格式。
4、使用雙引號—具有強約束的單引號變為普通單引號字符
兩個單引號之間不能使用單引號,在單引號中轉義符(\)都已經按照字面意思解釋。所以要想打印單引號,要用雙引號。
舉例:
運行下面代碼:
echo "Why can't I write 's between single quotes"
運行結果:
Why can't I write 's between single quotes
舉例: 單引號具有強約束力,在單引號中轉義符(\)都已經按照字面意思解釋。
運行下面的代碼:
var3='\\\\'
echo $var3
echo "$var3"
運行結果:
\\\\
\\\\
5、注意
1、雙引號中轉義符會被解釋,并按照其含義進行替換。
如果在$、`、\ 這三個字符前面,就是轉義符的意思,如果在其他字符前面,則不需要解釋,直接輸出\與其他字符。
舉例1:
運行下面代碼:
echo \
echo "\"
執行上面兩個語句,都會出現>的符號,意思是等待繼續的輸入。
舉例2:
運行下面代碼:
echo \a
echo "\a"
運行結果:
a
\a
舉例3:
運行下面代碼:
echo x\ty
echo "x\ty"
運行結果:
xty
x\ty
舉例3: 注意 echo -e 會將 “\t” 解釋成制表符。
運行下面代碼:
echo -e x\ty
echo -e "x\ty"
運行結果:
xty
x y
2、雙引號包含了 “!” 將會產生錯誤,這是因為shell將其解釋為查看歷史命令。
而在腳本中,因為歷史機制已經被關閉,所以不會產生這個問題。
舉例:
運行下面代碼:
echo "hello!"
運行結果:
-bash: !": event not found
運行下面代碼:
echo "hello\!"
運行結果:
hello\!
參考文章:
引用變量
shell中的引號和轉義