매개변수 확장을 통해(즉, printf를 사용하지 않고) 각 배열 요소를 추가(변경)하시겠습니까?

매개변수 확장을 통해(즉, printf를 사용하지 않고) 각 배열 요소를 추가(변경)하시겠습니까?

아래 스크립트를 통해 내 딜레마를 설명하겠습니다.

#!/bin/zsh

STUFF=( moose-hoof ovary clydsedale )

echo ${MINE=$(printf "MY-%s " $STUFF)}
echo ${MINE_EXP=${STUFF/^/MY-}}

MY-무스 발굽MY-난소MY-clydsedale

무스 발굽 집 clydsedale

배열의 모든 요소에 문자열 연결을 허용하는 올바른 확장 플래그는 무엇입니까?

답변1

사용 $^array.

배열을 배열의 중괄호 확장으로 변환합니다. 언제가 될지는 a=(foo bar baz)$^a그럴 것 같습니다 {foo,bar,baz}.

$ a=(foo bar baz)
$ echo prefix${^a}suffix
prefixfoosuffix prefixbarsuffix prefixbazsuffix

~을 위한재사용정렬:

$ a=(1 2 3) b=(a b c)
$ echo $^a$^b
1a 1b 1c 2a 2b 2c 3a 3b 3c

물론 접두사 또는 접미사에 셸 특수 문자(예: ;명령을 구분하거나 단어를 구분하는 공백 등 $"'&*[?~)가 포함된 경우 해당 문자를 묶어야 합니다.

echo 'p r e f i x '$^a' s u f f i x'

csh's(및 bash, ksh, zsh) 와 동일:

echo 'p r e f i x '{foo,bar,baz}' s u f f i x'

$^a자체는 인용되어서는 안 되며 "foo${^a}bar"다음으로 확장됩니다.하나단어. 참조하려는 상황 중 하나는 $^arrayfor와 마찬가지로 빈 요소를 유지하려는 경우입니다. 그런 다음 배열 확장을 인용하고 플래그 나 구문을 $array사용해야 합니다 (Bourne 쉘의 와 유사 ).(@)"${array[@]}""$@"

$ array=(x '')
$ printf '<%s>\n' $array         # empties removed
<x>
$ printf '<%s>\n' "$array"       # array elts joined with spaces
<x >
$ printf '<%s>\n' "${(@)array}"  # empties preserved
<x>
<>
$ printf '<%s>\n' "$array[@]"    # empties preserved
<x>
<>
$ printf '<%s>\n' $^array$^array # empty removed
<xx>
<x>
<x>
$ printf '<%s>\n' "$^array$^array" # concatenation of joined arrays
<x x >
$ printf '<%s>\n' "$^array[@]$^array[@]" # multiplexing with empties preserved
<xx>
<x>
<x>
<>

답변2

이것은 상당히 오래된 스레드이지만 동일한 작업을 수행하기 위해 최근 발견한 내용을 추가하고 싶었습니다.매개변수 확장바꾸다:

${name/pattern/repl}

...

패턴은 "#"으로 시작할 수 있습니다(이 경우 패턴은 문자열의 시작 부분에서 일치해야 함). 또는 "%"(이 경우 문자열 끝에서 일치해야 함)또는 '#%'인 경우 패턴은 전체 문자열과 일치해야 합니다. repl은 빈 문자열일 수 있으며, 이 경우 마지막 "/"도 생략할 수 있습니다. 다른 경우에는 인용할 마지막 "/" 앞에 백슬래시가 와야 합니다. "/"가 대체 매개변수 내에 나타나면 백슬래시가 필요하지 않습니다. 또한 교체 매개변수 내에 "#", "%" 및 "#%"가 나타나면 처음에도 활성화되지 않습니다.

#이를 통해 문자열의 시작/끝에서 패턴 일치가 가능하며 패턴만 사용하는 데에는 제한 이 없으며 %접두사 및 접미사 배열과 함께 사용할 수 있습니다.

$ array=(foo bar baz)
$ echo ${array/#/prefix_}
prefix_foo prefix_bar prefix_baz
$ echo ${array/%/_suffix}
foo_suffix bar_suffix baz_suffix

문자열을 더 쉽게 조작할 수 있기 때문에 확실히 편리하지는 않지만 여전히 가능합니다.

$ string="bar"
$ echo ${string/#/foo_}
foo_bar
$ echo ${string/%/_baz}
bar_baz

관련 정보