bash中有三種引號
- 單引號
兩個單引號包圍起來的字符串就是普通的字符串,它將保留原始的字面意思
- 雙引號
兩個雙引號包圍起來的字符串,部分特殊字符將起到它們的作用。
這些特殊字符有:美元符,反斜杠,反引號,感嘆號。
- 反引號
兩個反引號包圍起來的字符串,將作為命令來運行,執(zhí)行的輸出結(jié)果作為該反引號的內(nèi)容,稱為命令替換。
它有另一種更好的寫法:$(command)
- 美元符
$在單、雙引號中的表現(xiàn): 在雙引號中的$,將發(fā)生變量引用, 而在單引號中的$, 將保留它的字面意思 - 反斜杠在單、雙引號中的表現(xiàn): 在雙引號中的反引號,將轉(zhuǎn)義它后面的字符,使其具有特殊意義或者失去原來的特殊意義,在單引號中的反斜杠,將保留它的字面意思
- 反引號與其他兩種引號的不同: 反引號包圍起來的字符串將被運行,取其結(jié)果
常見的問題
- 把反引號寫成單引號
- 總是忘了加雙引號
seq 3
1
2
3
echo `seq 3`
1 2 3
echo "`seq 3`"
1
2
3
seq輸出的是包含換行的信息,但第二條命令卻丟失了換行符,因為bash在解析時認為反引號的輸出結(jié)果是3個獨立的字符,解析后與
echo 1 2 3相同(這個過程,bash做了很多工作,有興趣的可以了解下bash解析順序); 而第三條命令,bash把反引號的輸出結(jié)果當成一個整體對待(因為它被雙引號包圍),所以輸出的結(jié)果不會被bash拆分對待,換行符得以保留。所以,當你需要保留變量或者命令替換的 完整信息, 特別是換行符時,請記得給它們戴上雙引號作保險,時刻加個雙引號是個好習慣(為什么不是單引號呢?前面解釋了,單引號里面沒有魔法,變量也變不了了,命令替換也替換不了了)。
- 引號嵌套總是混亂的
雙引號中加入其他引號很容易,你只需要用反斜杠\轉(zhuǎn)義你要添加的引號。
單引號中加入單引號:
echo $'abc\'abc'
echo -e 'abc\x27abc'
echo 'abc'\''abc'
第一種方法是bash特有的,$'string' 之間到反斜杠都將轉(zhuǎn)義字符,第二種方法,通過單引號的ASCII碼來打印單引號,而第三種方法,則是通過截斷命令,在中間插入單引號來實現(xiàn)。一般用第一種方法是最優(yōu)雅的。