zsh:各単語を個別にエスケープする方法は?

zsh:各単語を個別にエスケープする方法は?

次のコマンドリストをどのように個別に引用できますか?

s="cp                                                  
mkdir
[[
mv
rm"

quoted_s= ????

これは次のように出力する必要がありますecho $quoted_s

cp                                                  
mkdir
\[\[
mv
rm

一緒に使用するか${(q)s}参照${(qq)s}してください。

$ echo ${(qq)s}
'cp
mkdir
[[
mv
rm'

ベストアンサー1

この場合、b拡張フラグを使用できます。またはinfo zsh flagman zshexpn

   b      Quote with backslashes only characters that are special to  pat‐
          tern  matching.

だから与えられた

~ % print -r -- $s
cp
mkdir
[[
mv
rm

それから

~ % print -r -- ${(b)s}
cp
mkdir
\[\[
mv
rm

より一般的には改行に分割し、q結果に適用した後に再結合することができます。

~ % print -r -- ${(F)${(qf)s}}
cp
mkdir
\[\[
mv
rm

または、cshスタイルのサフィックス修飾子を使用してください。

~ % print -r -- ${(F)${(f)s}:q}
cp
mkdir
\[\[
mv
rm

またはさらに(print改行を追加しましょう)

% print -rC1 -- ${(qf)s}
cp
mkdir
\[\[
mv
rm

(列-C1に印刷することの利点は、パラメータがないと空白行を印刷する代わりに何も印刷されないこと1 Cです。)-l

、、、、、、、フラグ、および修飾子はさまざまな種類の参照を生成bするため、q特定のユースケースに最適なものを選択してください。qqqqqqqqqq-q+:q

何をしても忘れないでください--。これを無視すると、最悪の脆弱性であるランダム命令注入の脆弱性が発生します。

おすすめ記事