Zsh

zsh:如何分別轉義每個單詞?

  • July 31, 2022

以下命令列表如何單獨引用?

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'

在這種情況下,您可以使用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在 olumn 上列印1 C的優勢-l在於,如果沒有參數,則不會列印任何內容,而不是一個空行)。

請注意,b, q, qq, qqq, qqqq, q-,q+標誌和:q修飾符會產生不同類型的引用,請選擇最適合您的特定案例的引用。

無論您做什麼,都不要忘記--. 省略它會引入任意命令注入漏洞,這是最糟糕的漏洞。

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