아래 스크립트를 통해 내 딜레마를 설명하겠습니다.
#!/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"
다음으로 확장됩니다.하나단어. 참조하려는 상황 중 하나는 $^array
for와 마찬가지로 빈 요소를 유지하려는 경우입니다. 그런 다음 배열 확장을 인용하고 플래그 나 구문을 $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