我有一个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智慧,人们应该双重引用所有内容)。
答案 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[@]}"