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, qq, qqq, qqqq, 플래그 및 수정 자는 다양한 유형의 참조를 생성하므로 특정 사용 사례에 가장 적합한 것을 선택하십시오.q-q+:q

무엇을 하든 잊지 마세요 --. 이를 무시하면 최악의 취약점인 임의 명령 주입 취약점이 발생합니다.

관련 정보