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}変数は、3つの別々の警告の代わりにスペースを含む1つの長い警告、「-Wall -Wextra -Wpedantic」として扱われるように見えるため、これは機能しません。

いくつかの検索を行った結果、evalを使って作業することができました。

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

しかし、これがなぜ必要なのか、そしてそれを修正する他の方法があるのか​​混乱しています。

編集:Peter O.の答えに示されているように実行することに加えて、次のこともできることがわかりました。

setopt shwordsplit

Zシェルを他の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"

おすすめ記事