Z-shell(zsh) 스크립트 명령에서 값에 공백이 포함된 변수를 사용하는 방법은 무엇입니까?

Z-shell(zsh) 스크립트 명령에서 값에 공백이 포함된 변수를 사용하는 방법은 무엇입니까?

다음 Z-쉘 스크립트가 있습니다.

compiler=clang++
standard=-std=c++11
warnings="-Wall -Wextra -Wpedantic"
${compiler} ${warnings} ${standard} -o ${1} ${1}.cpp

${warnings} 변수가 세 개의 개별 경고 대신 공백이 포함된 하나의 긴 경고인 "-Wall -Wextra -Wpedantic"으로 처리되는 것처럼 보이기 때문에 이는 작동하지 않습니다.

몇 가지 검색을 수행한 결과 eval을 사용하여 작업할 수 있었습니다.

eval "${compiler} ${warnings} ${standard} -o ${1} ${1}.cpp"

그러나 이것이 왜 필요한지, 그리고 이를 수정할 수 있는 다른 방법이 있는지 혼란스럽습니다.

편집: Peter O.의 답변에 표시된 대로 수행하는 것 외에도 다음을 수행할 수도 있음을 발견했습니다.

setopt shwordsplit

Z-shell이 ​​다른 Bourne 쉘 파생물처럼 동작하도록 만듭니다. 그들처럼FAQ에서 말합니다:

대부분의 Bourne-shell 파생어에서는 다중 단어 변수입니다.

var="foo bar"

명령에 전달되거나 for foo in $var 루프에 사용될 때 단어로 분할됩니다. 기본적으로 zsh에는 이러한 동작이 없습니다. 변수는 변경되지 않은 상태로 유지됩니다. (이것은 버그가 아닙니다! 아래를 참조하십시오.) SH_WORD_SPLIT 옵션은 호환성을 위해 존재합니다.

답변1

경고 옵션을 배열로 설정합니다. "${warnings[@]}"3명 생성성격

warnings=(-Wall -Wextra -Wpedantic)

"${compiler}" "${warnings[@]}" "${standard}" -o "${1}" "${1}.cpp"

또는 더 읽기 쉽다고 생각되면 ' 없이 배열을 만든 -W다음 -W명령줄에서 배열을 렌더링하여 '를 추가할 수 있습니다.

warnings=( all extra pedantic )

"${compiler}" "${warnings[@]/#/-W}" "${standard}" -o "${1}" "${1}.cpp"

답변2

$=다음을 사용하여 변수를 분할 할 수도 있습니다 $IFS.

${compiler} ${=warnings} ${standard} -o ${1} ${1}.cpp

관련 정보