Bash

shell:用單引號而不是反斜杠引用字元串

  • May 24, 2018

如何用單引號引用字元串?

例如,我可以這樣做:

$ 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'

來自Rich 的 sh posix 技巧

'該函式簡單地將字元串中的每個« »(單引號)實例替換為« » '\''(單引號、反斜杠、單引號、單引號),然後將單引號放在字元串的開頭和結尾。由於單引號中唯一具有特殊含義的字元是單引號字元本身,因此這是完全安全的。尾隨換行符得到正確處理,並且末尾的單引號兼作安全字元,以防止命令替換破壞尾隨換行符,如果有人想要執行以下操作:

 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'

zshprintf '%s\n' ${(q+)value} $'This isn\'t a \n\C-[ "correct" test'

小心一些 zsh 引用的字元串:上面的 ESC(\033 或 \x1b 或十進制 27)字元都是(技術上)引用的,但不可見。當發送到終端時,與其他控製字元一樣,甚至可能造成傷害。只有當它們在視覺上呈現為 $ ‘\033’, $ ‘\C-[’ 或 $’\E’,它們清晰可見且不含糊。

來自Bash 的手冊

${parameter@operator}

Q擴展是一個字元串,它是以可重複用作輸入的格式引用的參數值。

zshexpn手冊頁

q

用反斜杠在結果單詞中引用 shell 特殊的字元;不可列印或無效的字元使用該$'\NNN'表格引用,每個八位字節用單獨的引號引起來。

如果這個標誌被給出兩次,結果詞用單引號引起來,如果給出三次,結果詞被用雙引號引起來;在這些形式中,不會嘗試對不可列印或無效字元進行特殊處理。如果標誌被給出四次,則單詞用單引號引起來,前面帶有$. 請注意,在所有這三種形式中,引用都是無條件完成的,即使這不會改變 shell 解釋結果字元串的方式。

如果q-給出 a (只能q出現一個),則使用最小形式的單引號,僅在需要保護特殊字元時才引用字元串。通常這種形式會給出最易讀的輸出。

如果q+給定 a ,則使用最小引用的擴展形式,導致使用 . 呈現不可列印的字元$'...'。此引用類似於 typeset 命令系列的值輸出所使用的引用。

引用自:https://unix.stackexchange.com/questions/445469