シェル:バックスラッシュの代わりに一重引用符で文字列を引用符で囲みます。

シェル:バックスラッシュの代わりに一重引用符で文字列を引用符で囲みます。

一重引用符で文字列を引用するには?

たとえば、次のようにできます。

$ printf "%q\n" 'two words'
two\ words
$

単一(または二重)引用符付き文字列を出力として取得する方法はありますか?つまり:

$ MAGIC 'two words'
'two words'
$

一重引用符のバージョンが読みやすくなると思います。

私は{ba、z}shに適した答えが欲しいです。 POSIXシェルは追加ボーナスです。

ベストアンサー1

次のように言うと:

$ 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のヒント

この関数は、'文字列内の«»(一重引用符)の各インスタンスを« '\''»(一重引用符、バックスラッシュ、一重引用符、一重引用符)に置き換え、文字列の先頭と末尾に一重引用符を追加します。一重引用符内で特別な意味を持つ唯一の文字は、一重引用符文字自体であるため、これは完全に安全です。末尾の改行は正しく処理され、誰かが同様の操作を実行したい場合は、コマンドの置換が末尾の改行を破るのを防ぐために、末尾の一重引用符は安全な文字で2倍になります。

 quoted=$(quote "$var")

警告:上記のESC(\ 033または\ x 1bまたは10進数27)文字は(技術的に)引用されていますが、表示されません。他の制御文字と同様に、端末に送信すると害を及ぼす可能性があります。 $'\033'、$'\C-['、または $'\E' で視覚的にレンダリングされた場合にのみ表示され、あいまいではありません。

printf '%s\n' "${value@Q}" $'This isn\'t a \n\E "correct" test'

printf '%s\n' ${(q)value} This\ isn\'t\ a\ $'\n'$'\033'\ \"correct\"\ test
printf '%s\n' ${(qq)value} 'This isn'\''t a "correct" test'
printf '%s\n' ${(qqq)value} "This isn't a \"correct\" test"
printf '%s\n' ${(qqqq)value} $'This isn\'t a \n\033 "correct" test'
printf '%s\n' ${(q-)value} 'This isn'\''t a "correct" test'
printf '%s\n' ${(q+)value} $'This isn\'t a \n\C-[ "correct" test'

いくつかのzsh引用符文字列に注意してください。上記のESC(\ 033または\ x 1bまたは10進数27)文字はすべて技術的に引用されていますが、表示されません。他の制御文字と同様に、端末に送信すると害を及ぼす可能性があります。 $'\033'、$'\C-['、または $'\E' で視覚的にレンダリングされた場合にのみ表示され、あいまいではありません。

~からバッシュマニュアル:

${parameter@operator}
Q拡張は、入力として繰り返し使用できる形式でパラメータ値を参照する文字列です。

~からzshexpnマニュアルページ:

q
シェル固有の文字は、結果の単語からバックスラッシュとして引用されます。印刷できないか無効な文字は、$'\NNN'各オクテットに対して別々の引用符を使用して、次の形式で引用されます。

このフラグが2回指定された場合は、結果の単語が一重引用符で囲まれ、3回指定された場合、結果の単語がこれらの形式で二重引用符で囲まれて印刷できないか、無効な文字に対する特別な処理は試行されません。このフラグが4回表示される場合、単語は一重引用符で囲まれて前に付きます$。 3 つの形式すべてで、引用はシェルが結果文字列を解釈する方法を変更しなくても無条件に実行されます。

aが指定されている場合q-(1つだけが発生する可能性があるq)、一重引用符の最小形式が使用され、特殊文字を保護する必要がある場合にのみ文字列を引用します。通常、このフォームは最も読みやすい出力を提供します。

aが指定されている場合は、q+最小限に引用された拡張形式が使用され、印刷できない文字がを使用してレンダリングされます$'...'。この参照は、typeset コマンド系列の値の出力に使用される参照と似ています。

おすすめ記事