如何在 Z-shell (zsh) 脚本命令中使用值包含空格的变量?

如何在 Z-shell (zsh) 脚本命令中使用值包含空格的变量?

我有以下 Z-shell 脚本:

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 shell 衍生物一样。像他们在他们的常见问题解答中说:

在大多数 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

相关内容