shell:用單引號而不是反斜杠引用字元串
如何用單引號引用字元串?
例如,我可以這樣做:
$ printf "%q\n" 'two words' two\ words $
有沒有辦法獲得單(或雙)引號字元串作為輸出,即:
$ MAGIC 'two words' 'two words' $
我發現單引號版本更容易閱讀。
我想要一個適用於 {ba,z}sh 的答案。POSIX shell 將是一個獎勵。
假如說:
$ value=$'This isn\'t a \n\x1b "correct" test' $ printf '%s\n' "$value" This isn't a "correct" test
正則表達式
quote () { printf %s\\n "$1" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/'/" ; }
採用:
$ quote "${value}" 'This isn'\''t a "correct" test'
'
該函式簡單地將字元串中的每個« »(單引號)實例替換為« »'\''
(單引號、反斜杠、單引號、單引號),然後將單引號放在字元串的開頭和結尾。由於單引號中唯一具有特殊含義的字元是單引號字元本身,因此這是完全安全的。尾隨換行符得到正確處理,並且末尾的單引號兼作安全字元,以防止命令替換破壞尾隨換行符,如果有人想要執行以下操作:quoted=$(quote "$var")
警告:上面的 ESC(\033 或 \x1b 或十進制 27)字元被(技術上)引用,但不可見。當發送到終端時,與其他控製字元一樣,甚至可能造成傷害。只有當它們在視覺上呈現為 $ ‘\033’, $ ‘\C-[’ 或 $’\E’,它們清晰可見且不含糊。
重擊
printf '%s\n' "${value@Q}" $'This isn\'t a \n\E "correct" test'
zsh
printf '%s\n' ${(q)value} This\ isn\'t\ a\ $'\n'$'\033'\ \"correct\"\ test
zsh
printf '%s\n' ${(qq)value} 'This isn'\''t a "correct" test'
zsh
printf '%s\n' ${(qqq)value} "This isn't a \"correct\" test"
zsh
printf '%s\n' ${(qqqq)value} $'This isn\'t a \n\033 "correct" test'
zsh
printf '%s\n' ${(q-)value} 'This isn'\''t a "correct" test'
zsh
printf '%s\n' ${(q+)value} $'This isn\'t a \n\C-[ "correct" test'
小心一些 zsh 引用的字元串:上面的 ESC(\033 或 \x1b 或十進制 27)字元都是(技術上)引用的,但不可見。當發送到終端時,與其他控製字元一樣,甚至可能造成傷害。只有當它們在視覺上呈現為 $ ‘\033’, $ ‘\C-[’ 或 $’\E’,它們清晰可見且不含糊。
來自Bash 的手冊:
${parameter@operator}
Q
擴展是一個字元串,它是以可重複用作輸入的格式引用的參數值。
q
用反斜杠在結果單詞中引用 shell 特殊的字元;不可列印或無效的字元使用該
$'\NNN'
表格引用,每個八位字節用單獨的引號引起來。如果這個標誌被給出兩次,結果詞用單引號引起來,如果給出三次,結果詞被用雙引號引起來;在這些形式中,不會嘗試對不可列印或無效字元進行特殊處理。如果標誌被給出四次,則單詞用單引號引起來,前面帶有
$
. 請注意,在所有這三種形式中,引用都是無條件完成的,即使這不會改變 shell 解釋結果字元串的方式。如果
q-
給出 a (只能q
出現一個),則使用最小形式的單引號,僅在需要保護特殊字元時才引用字元串。通常這種形式會給出最易讀的輸出。如果
q+
給定 a ,則使用最小引用的擴展形式,導致使用 . 呈現不可列印的字元$'...'
。此引用類似於 typeset 命令系列的值輸出所使用的引用。