shell bash变量包含用单引号展开的空格

6gpjuf90  于 2023-08-07  发布在  Shell
关注(0)|答案(1)|浏览(107)

我有一个脚本,调用像这样(简化)

#!/bin/bash

if [[ -f one.source ]]
then
    make one CPPFLAGS='-DONE -DTWO -DTHREE'
fi

if [[ -f two.source ]]
then
    make two CPPFLAGS='-DONE -DTWO -DTHREE'
fi

字符串
定义的列表越来越长,我希望避免保持两个命令行同步。我想定义一个变量并在两个命令中使用它。我试过了

DEFINES='-DONE -DTWO -DTHREE'

DD="CPPFLAGS='"
DD+=$DEFINES
DD+="'"


有了这个

echo $DD
CPPFLAGS='-DONE -DTWO -DTHREE'


似乎做我想做的事,但是

make one $DD


不符合

make one 'CPPFLAGS='\''-DONE' -DTWO '-DTHREE'\'''
make: invalid option -- 'D'
make: invalid option -- 'T'
make: invalid option -- 'D'
make: invalid option -- 'T'
make: invalid option -- 'H'
Usage: make [options] [target] ...

vmjh9lq9

vmjh9lq91#

不要引用你自己。使用printf "%q"@Q扩展。
使用bash数组。

defines=(
   -DONE
   -DTWO
   -DTHREE
)
make_args=(
   "CPPFLAGS=${defines[*]@Q}"
)
make one "${make_args[@]}"

字符串
但是
$DD没有引号,所以它经历了单词拆分扩展,这将它拆分为空格。
使用shellcheck检查脚本。
马可是一位老爷爷。考虑使用较新的构建系统,如CMake。

相关问题