Bash 如何有条件地向shell脚本添加标志?

Bash 如何有条件地向shell脚本添加标志?,bash,scripting,Bash,Scripting,我想在bash脚本中运行一个命令,根据是否定义了环境变量$VERBOSE,使用或不使用-v标志。大概是这样的: #!/bin/bash /usr/local/bin/mongo-connector \ -m $MONGO_HOST \ -t $NEO_URI \ [if $VERBOSE then -v ] \ -stdout 如果设置了VERBOSE且为非空,则${VERBOSE:+-v}的计算结果为-v。如果VERBOSE未设置或为空,则其计算结果为空字符串。请注意,这是

我想在bash脚本中运行一个命令,根据是否定义了环境变量$VERBOSE,使用或不使用
-v
标志。大概是这样的:

#!/bin/bash

/usr/local/bin/mongo-connector \
  -m $MONGO_HOST \
  -t $NEO_URI \
  [if $VERBOSE then -v ] \
  -stdout
如果设置了VERBOSE且为非空,则
${VERBOSE:+-v}
的计算结果为
-v
。如果VERBOSE未设置或为空,则其计算结果为空字符串。请注意,这是一个必须避免使用双引号的实例。如果编写:
cmd“${VERBOSE:+-v}”
而不是
cmd${VERBOSE+:v}
,则当VERBOSE为空或未设置时,行为在语义上是不同的。在前一种情况下,
cmd
用一个参数(空字符串)调用,而在后一种情况下,
cmd
用零参数调用

args=(
  -m "$MONGO_HOST"
  -t "$NEO_URI"
  -stdout
)
if [[ -v VERBOSE ]]; then
    args+=(-v)
fi
/usr/local/bin/mongo-connector "${args[@]}"
要测试VERBOSE是否设置为特定字符串,可以执行以下操作:

/usr/local/bin/mongo-connector \
  -m "$MONGO_HOST" \
  -t "$NEO_URI" \
  $(case ${VERBOSE} in (v1) printf -- '-v foo';; (v2) printf -- '-v bar';; esac )\
  -stdout
但把它写成这样似乎更干净

case "${VERBOSE}" in
v1) varg=foo;;
v2) varg=bar;;
*)  unset varg;;
esac
/usr/local/bin/mongo-connector -m "$MONGO_HOST" -t "$NEO_URI" \
      ${varg+-v "$varg"} -stdout

再次注意这里使用双引号。您希望它们在
$varg
周围,以确保只传递一个字符串,而不希望
“${varg+-v“$varg”}”
,因为您希望确保不传递空字符串。此外,由于case语句明确地取消了<代码> VARG,所以现在我们可以省略<代码>:./P>< P>可读性,考虑使用数组来存储参数。

args=(
  -m "$MONGO_HOST"
  -t "$NEO_URI"
  -stdout
)
if [[ -v VERBOSE ]]; then
    args+=(-v)
fi
/usr/local/bin/mongo-connector "${args[@]}"
这似乎有效:

composer dump autoload$([“$env”=“production”]&&printf'--classmap authorivative')

是,但如何检查$VERBOSE是否设置为特定值?谢谢如果你想检查一个特定的值,你需要写一些明确的比较。例如,一个
案例
语句。没有简单的快捷方式。一个非常简单的示例可能是:[${VERBOSE/A SPECIFIC VALUE/YES}==YES]]&&{stuff for when VERBOSE是“A SPECIFIC VALUE”;}虽然这可能不是问题,但这会更改参数的顺序。True;您可以保留原始赋值的
-stdout
,然后在
if
语句后添加
args+=(-stdout)
以解决该问题。插入
-n
标志时需要使用
printf--n