zsh에서는 원하는 유효한 결과를 얻었지만 bash에서는 얻지 못했습니다. 무엇이 빠졌습니까? 문자열을 단어로 나누려고합니다.
불다
bash-3.2$ echo ${$(echo "Hello World")[@]}
bash: ${$(echo "Hello World")[@]}: bad substitution
zshrc
> echo ${$(echo "Hello World")[@]}
Hello World
답변1
Bash는 그러한 중첩 교체를 수행하지 않지만 zsh는 수행합니다. 이는 매우 유사합니다.
$ zsh -c 'a=abcdef; echo ${${a%ef}#ab}'
cd
$ bash -c 'a=abcdef; echo ${${a%ef}#ab}'
bash: ${${a%ef}#ab}: bad substitution
해결책은 임시 변수를 사용하는 것입니다.
$ tmp=($(echo "Hello World"))
$ printf "%s\n" "${tmp[@]}"
Hello
World
참고하세요;
"$@"
일반적으로 또는 앞뒤에 따옴표를 추가 해야 합니다"${foo[@]}"
. 그렇지 않으면 확장 시 단어 분리가 수행됩니다. 할당 중에 이미 토큰화되었으므로 여기서는 중요하지 않지만 일반적으로 배열에는 중요합니다.- 할당에서 인용되지 않은 확장은 파일 이름 글로빙의 영향도 받습니다.
echo
모든 인수를 공백으로 연결하므로 단어 분할 결과를 보기 위한 좋은 도구는 아닙니다. 따라서 인수에 공백이 있는지 또는echo
공백이 추가되었는지(echo "foo bar" doo
동일한 출력이 있는지echo foo bar doo
) 확인할 수 없습니다.