在 bash 裡,一共有五個地方支援反斜槓開頭的轉義序列,包括兩個內部命令 echo 和 printf 的引數裡,字串語法 $'...' 裡,還有四個提示符變數 ps1-ps4 裡,以及在 readline 配置檔案裡(用來自定義鍵盤快捷鍵)。其中後兩者不在本文的討論範圍內,我們只看看前三個命令/語法在對某些轉義序列解釋上的差異。
$'...' 會把反斜槓去掉,只分別輸出問號,單引號,雙引號這三個字串本身,而 echo -e 會原樣輸出(保留反斜槓),也就是不把這三個東西當成轉義序列。printf 要分兩種情況來看,一種情況是轉義序列出現在 printf 的格式字串中,也就是出現在 printf 的第乙個引數中,這種情況它的表現像 $'...',還有一種就是轉義序列出現在與 printf 第乙個引數裡的 %b 格式指示符對應的隨後的引數裡的情況,這時候它的表現像 echo -e,下面看演示。
$ echo $'\?'$'\''$'\"' # 反斜槓不見了
$ echo -e '\?'"\'"'\"' # 原樣輸出
$ printf '\?'"\'"'\"''\n' # 表現的像 $'...'
$ printf '%b' '\?'"\'"'\"''\n' # 表現的像 echo -e
$'...' 只支援 \nnn,而 echo -e 只支援 \0nnn。printf 還是要分兩種情況來看,出現在格式字串中的表現像 $'...',出現在 %b 的引數裡是,同時支援 \nnn 和 \0nnn 兩種形式,下面看演示。
$ echo $'\100' $'\0100' # 第二個引數裡的 \0100 被解釋成了 \010 和 0,所以 echo 分別輸出了 @,\010,0 這三個字元,第二個字串就是 \b,它不可見
@ 0$ echo -e '\100' '\0100' # \100 原樣輸出
\100 @
$ printf '\100 \0100\n' # \010 也就是退格符刪掉了中間的空格,所以 @ 和 0 之間緊挨著
@0$ printf '%b' '\100\0100\n' # 兩種語法都支援
$'...' 會把 \c 以及它後面的那個字元(x)合起來看成乙個轉義序列,解義後的值會是個控制字元(ascii 碼在 0 到 31 之間的字元),其解義演算法是這樣的:chr(ord(x) & 31)。而 echo -e 會把 \c 看成是字串的終結符號,在 \c 之後的所有字元都會被丟棄掉,對應於 c 語言字串中表示字串結尾的 \0 字元,其底層實現也的確是把 \c 解義成了 \0(bash 是用 c 語言寫的)。printf 還是要分兩種情況來看,如果出現在格式字串中,\c 會原樣輸出,如果出現在 %b 的引數裡是,\c 的表現像 echo -e,下面看演示。
$ echo $'\c*' # \c* 解義 之後是 \n,所以下面會有兩個空行
$ echo -e 'hello\cworld' # world 以及最後的換行符都被吞掉了
hello
$ printf '\c*\n' # \c 原樣輸出
\c*$ printf '%b' 'hello\cworld' # 表現的和 echo -e 一樣
hello
上面講的所有這些在 bash manual 裡都有提到,只是有些點說的比較隱含。你只要知道這三種用來輸出轉義序列的命令/語法是有細微差別的就可以了,不要去嘗試記憶這些差別,因為你可能一輩子也遇不上。同時在看 bash manual 的時候發現講 $'...' 的章節漏掉了對 \? 這個轉義序列的記載,雖然不是什麼大事,但還是報了個 bug
轉義字元(轉義序列)
在程式設計中有一些字元是打不出來的,比如換行,提示音,下乙個製表位等等,於是程式語言的開發者就設計了轉義序列 escape sequence 這種東西用來表達這些字元。下面就是一些轉義字元 轉義字元 功能 反斜槓 單引號 雙引號 aascii響鈴符 bel bascii退格符 bs fascii進紙...
學習bash裡的getopts
source getopts optstring varname arg optstringoption字串,會逐個匹配 varname每次匹配成功的選項 arg引數列表,沒寫時它會取命令列引數列表 optind特殊變數,option index,會逐個遞增 optarg特殊變數,option ar...
Python 轉義序列
backslash 反斜槓 single quote 單引號 double quote 雙引號 a ascii bell bel 響鈴符 b ascii backspace bs 退格符 f ascii formfeed ff 進紙符 n ascii linefeed lf 換行符 n charac...