배열의 각 요소 앞에 텍스트를 추가하세요.

배열의 각 요소 앞에 텍스트를 추가하세요.

에서는 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

가장 좋은 대답은 수정된 배열이 필요한 대상에 따라 다릅니다.

  1. 질문에서와 같이 명령줄 인수를 생성하는 경우그리고--file=foo대체 플래그를 허용하는 도구를 사용하고 있으며 --file foo가장 관용적인 방법은 ${^name}확장 형식을 사용하는 것입니다.

    $ items=(foo "two words" baz)
    $ print -lr -- --file=${^items}
    --file=foo
    --file=two words
    --file=baz
    

    제가 시연하는 데 사용한 확장은 print -lr세 가지 요소가 있는 배열을 생성합니다. 이러한 명령을 호출하면 명령에 세 개의 매개변수가 표시됩니다.

  2. 명령줄 인수를 생성하려면 --file이 예에서 추가하려는 텍스트를 더미 배열에 넣고 ${name:^^arrayname}확장된 형식을 사용하여 이를 인수 배열과 결합할 수 있습니다.

    $ flag=(--file)
    $ items=(foo "two words" baz)
    $ print -lr -- ${flag:^^items}
    --file
    foo
    --file
    two words
    --file
    baz
    

    이는 6개 요소의 배열입니다. 이 형식이나 (1)(또는 둘 다)의 형식은 관련 값과 함께 플래그를 전달하기 위한 모든 명령줄 도구에서 허용되어야 합니다.

  3. 등호 대신 공백을 사용하도록 (1)의 방법을 수정할 수 있습니다.

    $ items=(foo "two words" baz)
    $ print -lr -- --file\ ${^items}
    --file foo
    --file two words
    --file baz
    

    (참고하세요.가지다공백을 이스케이프하려면 백슬래시를 사용하고 "--file ${^items}"다른 의미에는 큰따옴표를 사용하십시오. ) 이는 세 개의 요소로 구성된 배열이지만 각 요소에 공백이 포함되어 있습니다. 이 형식의 플래그를 허용하는 명령줄 도구는 거의 없지만 다른 유형의 텍스트 조작에 유용할 수 있습니다.

  4. ${name/pattern/repl}확장의 형태를 취할 수도 있습니다 . 패턴은 #(모든 배열 요소의 시작 부분에서 일치해야 함을 나타냄)로 시작해야 하지만 그렇지 않으면 비어 있어야 합니다(모든 배열 요소가 일치하고 실제로 대체되는 텍스트가 없도록).

    $ items=(foo "two words" baz)
    $ print -lr -- ${items/#/--file }
    --file foo
    --file two words
    --file baz
    

    이는 (3)과 동일한 주의 사항을 가지며 해당 접근 방식보다 덜 관용적입니다.

이 네 가지 메소드는 모두 배열 요소에 공백이 포함된 경우 올바른 작업을 수행합니다(즉, 문자열을 공백으로 갑자기 분할하지 않음).

답변2

Pglob 수정자를 사용할 수 있습니다 ! 당신이 주장한다면 모든 것이 구체가 될 수 있습니다. 내가 실제로 그럴 것이라고 말하는 것이 아니라는 점에 유의하시기 바랍니다.생각하다가서 이것을 해보세요. 이것이 최선의 접근 방식이 될 상황은 생각할 수 없습니다. 하지만 기술적으로는 가능합니다.

% 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 

관련 정보