shell腳本中的單引號和雙引號以及反引號詳解


文章目錄
引用
單引號'
雙引號"
反斜線
反引號`
引用
在第五章中講到shell中的引用,shell能識別到4種不同的引用字符:

單引號’
雙引號"
反斜線
反引號`
前兩種和最后一種必須成對出現,而反斜線可以在命令中根據需要多次出現,這些引用字符在shell中的含義和功能各不相同。

單引號’
shell碰到第一個’,在遇到用於封閉的’之前,shell會忽略單引號對中引用的所有特殊字符,即不再解釋字符串中任何特殊字符,對內容的保護比較強,單引號最常見的地方就是一個字符串參數中含有空格時,shell通常會使用空格作為分割符,將一個字符串解釋成了多個字符串參數,如下例:

$ echo one teo three four
one teo three four
$ echo 'one teo three four'
one teo three four
1
2
3
4
雙引號"
雙引號的作用類似於單引號,除了對於內容的保護要弱於后者,雙引號會忽略引用的大部分特殊字符。具體來說,下面3個字符在雙引號中不會被忽略:

美元符號 $
反引號 `
反斜線
touch file{01..10}
filelist=*
echo $filelist
file01 file02 file03 file04 file05 file06 file07 file08 file09 file10
echo '$filelist'
$filelist
echo "$filelist"
*
1
2
3
4
5
6
7
8
上面的例子中對比了不使用引號,使用單引號以及使用雙引號之間的主要不同,在第3行中shell看到了星號並將其替換成當前目錄下的所有文件名, 在第5行中,shell完全不處理單引號中的字符,因此顯示出了" f i l e l i s t " , 在 第 7 行 中 雙 引 號 指 示 s h e l l 需 要 在 其 中 執 行 變 量 名 替 換 , 因 此 s h e l l 將 " filelist", 在第7行中雙引號指示shell需要在其中執行變量名替換,因此shell將" filelist",在第7行中雙引號指示shell需要在其中執行變量名替換,因此shell將"filelist"解釋為"",因為文件名不會再雙引號中完成,所以被只有""被傳遞給了echo。

當字符串中含有單引號或雙引號時,可以使用雙引號來保留單引號,反之亦然。

x=" hello, 'world'"
echo $x
hello, 'world'
y=' hello, "world"'
echo $y
hello, "world"
1
2
3
4
5
6
反斜線
除了少數幾處例外,反斜線(作為前綴使用)在功能上相當於在單個字符周圍放置單引號,反斜線可以對緊隨其后的字符進行轉義。

echo >
-bash: syntax error near unexpected token `newline'
echo >

x=*
echo $x
$x
1
2
3
4
5
6
7
如上,shell忽略了反斜線之后的>和$x,所以不在執行變量替換。

當反斜線作為一行最后一個字符時,shell將其視為續行符,會刪除隨后的換行符,也不會將該換行符作為參數分隔符(假裝這個字符沒出現過)。在輸入跨多行的長命令時經常用這種方法。

$ echo "1234\

5678
90"
1234567890
1
2
3
4
值得注意的是反斜線的作用在雙引號中也是有效的,但在單引號中被作為普通字符處理

反引號`
反引號不像之前碰到的那些引號,因為它的功能和用法和前面那三種完全不同。反引號用於告訴shell將其中的命令使用命令輸出代替, shell會先執行反引號或者 ( ) 中 的 指 令 , 將 輸 出 插 入 到 對 應 的 位 置 中 。 反 引 號 和 ()中的指令,將輸出插入到對應的位置中。反引號和 ()中的指令,將輸出插入到對應的位置中。反引號和(…)在功能上是一樣的,只是$(…)是一種更新更可取的命令替換寫法。反引號的一般使用格式為:

command
1
echo The date and time is: date
The date and time is: Sun Jan 5 15:17:27 CST 2020
echo The date and time is: $(date)
The date and time is: Sun Jan 5 15:17:39 CST 2020
1
2
3
4
name="AbcDefg"

轉化為大寫

name=$(echo $name | tr '[a-z]' 'A-Z')
echo $name
ACDDFGH


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM