This question was migrated来自服务器故障,因为它可以在堆栈溢出时得到响应。
Migrated四年前。
如果设置了$FOO,我想运行:
cd "$OUTPUTDIR" && fpm -s dir -t rpm \
  -a x86_64 \
  --epoch "${PKGEPOCH}" \
  -n "${PACKAGENAME}" \
  --version "${PKGVERSION}" \
  --iteration "${PKGRELEASE}" \
  -C "$OUTPUTDIR/installroot" \
  --description="${PKGDESCRIPTION}" \
  .

如果未设置$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
  .

如果我在$D周围加上引号,它就会变成一个额外的(空白)参数。
如果$PKGDESCRIPTION包含特殊字符并且不生成空白参数,是否有一种方法可以做到这一点?

最佳答案

如果PKGDESCRIPTION是唯一需要这种条件处理的参数,则可以使用“alternate value”扩展:

[...] && fpm -s dir -t rpm \
    [...] \
    ${PKGDESCRIPTION:+ --description="${PKGDESCRIPTION}"} \
    .

说明::+表示除非PKGDESCRIPTION设置为非空值,否则将扩展为空;如果设置为非空值,则扩展为--description="${PKGDESCRIPTION}",双引号使其忽略PKGDESCRIPTION值中的特殊字符。请注意,:+ --中的空间是不需要的,但不会造成伤害,并且至少使它稍微容易阅读。
顺便说一下,如果不止一个论点需要这样的处理,我会采用@glenn jackman的方法。

10-04 11:45