由于 Bash 数组取消引用而导致包名称无效

由于 Bash 数组取消引用而导致包名称无效

我正在尝试从源代码构建 Emacs。当列出配置选项而没有正确配置 Emacs 阵列时。当我添加 Bash 数组来添加可选选项时,它破坏了配置。这是损坏的数组:

BUILD_OPTS=('--with-xml2' '--without-x' '--without-sound' '--without-xpm'
    '--without-jpeg' '--without-tiff' '--without-gif' '--without-png'
    '--without-rsvg' '--without-imagemagick' '--without-xft' '--without-libotf'
    '--without-m17n-flt' '--without-xaw3d' '--without-toolkit-scroll-bars' 
    '--without-gpm' '--without-dbus' '--without-gconf' '--without-gsettings'
    '--without-makeinfo' '--without-compress-install')

if [[ ! -e "/usr/include/selinux/context.h" ]] &&
   [[ ! -e "/usr/local/include/selinux/context.h" ]]; then
    BUILD_OPTS+=('--without-selinux')
fi

    PKG_CONFIG_PATH="${BUILD_PKGCONFIG[*]}" \
    CPPFLAGS="${BUILD_CPPFLAGS[*]}" \
    CFLAGS="${BUILD_CFLAGS[*]}" CXXFLAGS="${BUILD_CXXFLAGS[*]}" \
    LDFLAGS="${BUILD_LDFLAGS[*]}" LIBS="${BUILD_LIBS[*]}" \
./configure --prefix="$INSTALL_PREFIX" --libdir="$INSTALL_LIBDIR" \
    "${BUILD_OPTS[*]}"

使用数组进行配置时,会导致:

configure: error: invlaid package name: xml2 --without-x --without-sound --without-xpm --without-jpeg --without-tiff --without-gif ...

我已经经历过10.2.数组变量但我不明白我做错了什么。更改为双引号和无引号没有帮助。

有什么问题以及如何解决它?

答案1

man bash

   Any element of an array may  be  referenced  using  ${name[subscript]}.
   The braces are required to avoid conflicts with pathname expansion.  If
   subscript is @ or *, the word expands to all members  of  name.   These
   subscripts  differ only when the word appears within double quotes.  If
   the word is double-quoted, ${name[*]} expands to a single word with the
   value  of each array member separated by the first character of the IFS
   special variable, and ${name[@]} expands each element of name to a sep‐
   arate  word.

TL/DR:用来"${BUILD_PKGCONFIG[@]}"代替"${BUILD_PKGCONFIG[*]}"

为了显示:

$ arr=('foo' 'bar baz')
$ printf '%s\n' "${arr[*]}"
foo bar baz
$ 
$ printf '%s\n' "${arr[@]}"
foo
bar baz

答案2

您正在扩展数组的所有元素,将其与中间的空格连接在一起,作为单个参数。

使用"${arrayname[@]}"而不是"${arrayname[*]}"你应该得到你期望的结果。

请参阅LESS='+/^[[:space:]]*Arrays' man bash进一步阅读。

相关内容