双引号时,Bash导入的变量会破坏configure脚本

时间:2014-11-18 04:04:00

标签: bash

我有一个bash脚本,它从另一个静态文件中导入相同的变量,当调用脚本时,该文件本身使用由另一个文件设置的环境变量。

这是导入的文件并设置了一些变量。

# package.mk
PKG_NAME="binutils"
PKG_VERSION="2.24"
PKG_URL_TYPE="http"
PKG_URL="http://ftp.gnu.org/gnu/binutils/${PKG_NAME}-${PKG_VERSION}.tar.bz2"
PKG_DEPENDS=""
PKG_SECTION="devel"

PKG_CONFIGURE_OPTS="--prefix=${TOOLS} \
                    --target=${TARGET} \
                    --with-sysroot=${TOOLS}/${TARGET} \
                    --disable-nls \
                    --disable-multilib"

构建脚本使用它:

#!/bin/bash

# Binutils

. settings/config

pkg_dir="$(locate_package 'binutils')"

. "${pkg_dir}/package.mk"

# etc...

"${CLFS_SOURCES}/${PKG_NAME}-${PKG_VERSION}/configure" "${PKG_CONFIGURE_OPTS}"

# etc...

此脚本首先导入settings/config文件,该文件包含此脚本和其他人使用的一堆全局变量,并将它们导出,以便它们可用作环境变量。然后,它为我们正在构建的特定组件找到正确的package.mk文件,并将其导入。到目前为止,非常好。

但是,当我为配置脚本双引号选项(PKG_CONFIGURE_OPTS)时:

"${CLFS_SOURCES}/${PKG_NAME}-${PKG_VERSION}/configure" "${PKG_CONFIGURE_OPTS}"`

我收到以下错误:

gcc: error: unrecognized command line option ‘--with-sysroot=/root/LiLi/target/cross-tools/arm-linux-musleabihf’

如果我不引用它,请注意:

"${CLFS_SOURCES}/${PKG_NAME}-${PKG_VERSION}/configure" ${PKG_CONFIGURE_OPTS}`

它工作正常(--with-sysroot=确实是binutils的有效配置标志。)

这是为什么?我可以改变什么,以便我可以双重引用那一部分(通过bash智慧,人们应该双重引用所有内容)。

1 个答案:

答案 0 :(得分:4)

引用变量意味着整个事物作为单个参数传递,包括空格和换行符。您希望执行单词拆分,以便将字符串视为多个参数。这就是为什么不加引号的作品。

如果您正在寻找“正确”的方法来处理这个问题,我建议您使用数组。数组可以保存多个值,同时也可以正确保留空格。

PKG_CONFIGURE_OPTS=(--prefix="$TOOLS"
                    --target="$TARGET"
                    --with-sysroot="$TOOLS/$TARGET"
                    --disable-nls
                    --disable-multilib)

...

"$CLFS_SOURCES/$PKG_NAME-$PKG_VERSION/configure" "${PKG_CONFIGURE_OPTS[@]}"