如何安全地引用可选标志?

Tom*_*ime 4 bash

如果$FOO设置,我想运行:

cd "$OUTPUTDIR" && fpm -s dir -t rpm \
  -a x86_64 \
  --epoch "${PKGEPOCH}" \
  -n "${PACKAGENAME}" \
  --version "${PKGVERSION}" \
  --iteration "${PKGRELEASE}" \
  -C "$OUTPUTDIR/installroot" \
  --description="${PKGDESCRIPTION}" \
  .
Run Code Online (Sandbox Code Playgroud)

如果$FOO没有设置,我根本不想包含该标志.

如果--description=(空),程序将失败.

但是,有时描述包括引号和其他特殊字符,所以我不想这样做:

if [[ -z "PKGDESCRIPTION" ]]; then
    D=--description="${PKGDESCRIPTION}"
fi
cd "$OUTPUTDIR" && fpm -s dir -t rpm \
  -a x86_64 \
  --epoch "${PKGEPOCH}" \
  -n "${PACKAGENAME}" \
  --version "${PKGVERSION}" \
  --iteration "${PKGRELEASE}" \
  -C "$OUTPUTDIR/installroot" \
  $D
  .
Run Code Online (Sandbox Code Playgroud)

如果我把引号括起来$D那么它就变成了一个额外的(空白)arg.

有没有办法做到这一点,如果$PKGDESCRIPTION包含特殊字符并且不生成空白arg ,则不会成为安全问题?

gle*_*man 9

使用数组是唯一理智的方法:

options=( -a x86_64  -C "$OUTPUTDIR/installroot" )
[[ $PKGEPOCH ]]       && options+=( --epoch "$PGKEPOCH" )
[[ $PACKAGENAME ]]    && options+=( -n "$PACKAGENAME" )
[[ $PKGVERSION ]]     && options+=( --version "$PKGVERSION" )
[[ $PKGRELEASE ]]     && options+=( --iteration "$PKGRELEASE" )
[[ $PKGDESCRIPTION ]] && options+=( --description="$PKGDESCRIPTION" )

cd "$OUTPUTDIR" && fpm -s dir -t rpm "${options[@]}"
Run Code Online (Sandbox Code Playgroud)

另见http://mywiki.wooledge.org/BashFAQ/050