我有以下 Z-shell 脚本:
compiler=clang++
standard=-std=c++11
warnings="-Wall -Wextra -Wpedantic"
${compiler} ${warnings} ${standard} -o ${1} ${1}.cpp
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为 ${warnings} 变量似乎被视为“-Wall -Wextra -Wpedantic” - 这是一个带有空格的长警告,而不是三个单独的警告。
我做了一些搜索,并能够让它与 eval 一起工作:
eval "${compiler} ${warnings} ${standard} -o ${1} ${1}.cpp"
Run Code Online (Sandbox Code Playgroud)
但是,我对为什么有必要感到困惑,还有其他方法可以纠正这个问题。
编辑:除了按照 Peter O. 的回答进行操作外,我发现您还可以执行以下操作:
setopt shwordsplit
Run Code Online (Sandbox Code Playgroud)
使 Z-shell 表现得像其他 Bourne shell 衍生物。正如他们在常见问题解答中所说:
在大多数 Bourne-shell 衍生品中,多词变量如
Run Code Online (Sandbox Code Playgroud)var="foo bar"当传递给命令或在 $var 循环中的 for foo 中使用时,它们被拆分为单词。默认情况下, zsh 没有这种行为:变量保持不变。(这不是错误!见下文。)选项 SH_WORD_SPLIT 存在以提供兼容性。
将您的警告选项设置为数组。"${warnings[@]}"生成 3 个单独的单词
warnings=(-Wall -Wextra -Wpedantic)
"${compiler}" "${warnings[@]}" "${standard}" -o "${1}" "${1}.cpp"
Run Code Online (Sandbox Code Playgroud)
或者,如果您发现它更清晰,您可以创建不带-W's的数组,然后-W通过在命令行上显示数组的方式添加's。
warnings=( all extra pedantic )
"${compiler}" "${warnings[@]/#/-W}" "${standard}" -o "${1}" "${1}.cpp"
Run Code Online (Sandbox Code Playgroud)
小智 5
您还可以使用$=以下方式拆分变量$IFS:
${compiler} ${=warnings} ${standard} -o ${1} ${1}.cpp
Run Code Online (Sandbox Code Playgroud)