Bash에서 표현식을 공백으로 분할하는 방법은 무엇입니까?

Bash에서 표현식을 공백으로 분할하는 방법은 무엇입니까?

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) 확인할 수 없습니다.

관련 정보