Bash 变量替换中的双引号

Bash 变量替换中的双引号

我正在尝试使用脚本配置一些软件包,因此出现以下问题。假设环境变量PREFIX设置为我计划安装软件的位置。在我的脚本里面我有

CONFOPTS="--enable-shared --with-blas=\"-L${PREFIX}/lib/ -lblas\" --with-lapack=\"-L${PREFIX}/lib -llapack\""
echo CONFOPTS=$CONFOPTS    

打印

CONFOPTS=--enable-shared --with-blas="-L/scratch/test/lib/ -lblas" --with-lapack="-L/scratch/test/lib -llapack"

如果之后想在脚本中运行配置

set -x
./configure --prefix=${PREFIX} ${CONFOPTS}
set +x

它被扩展到

 ./configure --prefix=/scratch/test --enable-shared '--with-blas="-L/scratch/test/lib/' '-lblas"' '--with-lapack="-L/scratch/test/lib' '-llapack"'

这是垃圾,并且被配置脚本和 shell 误解。正确的应该是

./configure --prefix=/scratch/test --enable-shared --with-blas="-L/scratch/test/lib/ -lblas" --with-lapack="-L/scratch/test/lib -llapack"

如何更改行为以便在配置调用中获得正确的命令行?

答案1

将您的选项放入数组中,然后您可以引用它:

declare -a CONFOPTS
CONFOPTS=(
    '--enable-shared'
    "--with-blas=-L${PREFIX}/lib/ -lblas"
    "--with-lapack=-L${PREFIX}/lib -llapack"
)


./configure --prefix="${PREFIX}" "${CONFOPTS[@]}"

我不确定我是否正确分隔了您的选项,如果您需要调整方面的帮助,请告诉我。


如果您确实需要维护这些双引号并将它们传递给configure,请尝试以下操作:

declare -a CONFOPTS
CONFOPTS=(
    '--enable-shared'
    '--with-blas="-L${PREFIX}/lib/ -lblas"'
    '--with-lapack="-L${PREFIX}/lib -llapack"'
)


./configure --prefix="${PREFIX}" "${CONFOPTS[@]}"

甚至这个?:

declare -a CONFOPTS
CONFOPTS=(
    '--enable-shared'
    "--with-blas=\"-L${PREFIX}/lib/ -lblas\""
    "--with-lapack=\"-L${PREFIX}/lib -llapack\""
)


./configure --prefix="${PREFIX}" "${CONFOPTS[@]}"

相关内容