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

(在 olumn-C1上打印的1 C优点是-l,如果没有参数,则不会打印任何内容,而不是打印一个空行)。

请注意,bqqqqqqqqqqq-q+标志和:q修饰符会产生不同类型的引用,请选择最适合您的特定用例的引用。

无论你做什么,都不要忘记--。忽略它会引入任意命令注入漏洞,这是最糟糕的一种漏洞。

相关内容