에서는 zsh
전역 확장을 통해 이 P
플래그를 사용하여 각 일치 항목 앞에 텍스트를 추가할 수 있습니다.
$ ls -1
bar
baz
foo
$ print -- *(P:--file:)
--file bar --file baz --file foo
배열 매개변수와 비슷한 것이 있나요? 내가 쓴다면
items=(foo bar baz)
그러한 동작을 수행하는 데 사용할 수 있는 플래그가 있습니까?
$ print -- ${(...)items}
--file foo --file bar --file baz
답변1
가장 좋은 대답은 수정된 배열이 필요한 대상에 따라 다릅니다.
질문에서와 같이 명령줄 인수를 생성하는 경우그리고
--file=foo
대체 플래그를 허용하는 도구를 사용하고 있으며--file foo
가장 관용적인 방법은${^name}
확장 형식을 사용하는 것입니다.$ items=(foo "two words" baz) $ print -lr -- --file=${^items} --file=foo --file=two words --file=baz
제가 시연하는 데 사용한 확장은
print -lr
세 가지 요소가 있는 배열을 생성합니다. 이러한 명령을 호출하면 명령에 세 개의 매개변수가 표시됩니다.명령줄 인수를 생성하려면
--file
이 예에서 추가하려는 텍스트를 더미 배열에 넣고${name:^^arrayname}
확장된 형식을 사용하여 이를 인수 배열과 결합할 수 있습니다.$ flag=(--file) $ items=(foo "two words" baz) $ print -lr -- ${flag:^^items} --file foo --file two words --file baz
이는 6개 요소의 배열입니다. 이 형식이나 (1)(또는 둘 다)의 형식은 관련 값과 함께 플래그를 전달하기 위한 모든 명령줄 도구에서 허용되어야 합니다.
등호 대신 공백을 사용하도록 (1)의 방법을 수정할 수 있습니다.
$ items=(foo "two words" baz) $ print -lr -- --file\ ${^items} --file foo --file two words --file baz
(참고하세요.가지다공백을 이스케이프하려면 백슬래시를 사용하고
"--file ${^items}"
다른 의미에는 큰따옴표를 사용하십시오. ) 이는 세 개의 요소로 구성된 배열이지만 각 요소에 공백이 포함되어 있습니다. 이 형식의 플래그를 허용하는 명령줄 도구는 거의 없지만 다른 유형의 텍스트 조작에 유용할 수 있습니다.${name/pattern/repl}
확장의 형태를 취할 수도 있습니다 . 패턴은#
(모든 배열 요소의 시작 부분에서 일치해야 함을 나타냄)로 시작해야 하지만 그렇지 않으면 비어 있어야 합니다(모든 배열 요소가 일치하고 실제로 대체되는 텍스트가 없도록).$ items=(foo "two words" baz) $ print -lr -- ${items/#/--file } --file foo --file two words --file baz
이는 (3)과 동일한 주의 사항을 가지며 해당 접근 방식보다 덜 관용적입니다.
이 네 가지 메소드는 모두 배열 요소에 공백이 포함된 경우 올바른 작업을 수행합니다(즉, 문자열을 공백으로 갑자기 분할하지 않음).
답변2
P
glob 수정자를 사용할 수 있습니다 ! 당신이 주장한다면 모든 것이 구체가 될 수 있습니다. 내가 실제로 그럴 것이라고 말하는 것이 아니라는 점에 유의하시기 바랍니다.생각하다가서 이것을 해보세요. 이것이 최선의 접근 방식이 될 상황은 생각할 수 없습니다. 하지만 기술적으로는 가능합니다.
% items=(foo bar baz)
% print -lr -- /(P:--file:e\''reply=($items[@])'\')
--file
bar
--file
baz
--file
foo
파일 이름과 정확하게 일치하는 glob을 생성하고( /
잘 작동함) glob 한정자를 사용하여 e
하나의 일치 항목을 임의의 목록으로 바꾼 다음 P
한정자를 결과에 적용하는 방식으로 작동합니다.
이는 와일드카드가 수행되는 컨텍스트에만 적용되지만 일반적으로 배열이 허용되는 경우입니다.
답변3
다음을 수행하여 이식적으로(또는 적어도 이 배열 구문을 지원하는 셸에서) 이 작업을 수행할 수 있습니다 printf
.
$ items=(foo bar baz)
$ printf -- "--file %s " "${items[@]}"
--file foo --file bar --file baz $
그러나 해당 print
명령과 달리 후행 줄 바꿈을 추가하지 않습니다(이것이 $
위의 출력과 동일한 줄에 있는 이유입니다). 이것이 거래 중단인 경우 다음을 수행할 수 있습니다.
$ printf -- "--file %s " "${items[@]}"; echo ""
--file foo --file bar --file baz