(可选)将参数传递给脚本中的命令

时间:2018-04-11 23:43:53

标签: shell sh

我有一个shell脚本,其中包含以下部分:

if [ "$condition" -eq 1 ]; then
    external_command -argument value1
else
    external_command -argument value1 -second_argument value2
fi

我被这种重复所困扰,所以我尝试了这个:

arg="-second_argument"
val="value2"
if [ "$condition" -eq 1 ]; then
    arg=""
    val=""
fi
external_command -argument value1 "$arg" "$val"

它不起作用,因为external_command仍然将空字符串作为不同的参数和抱怨。

有没有办法在不重复构建命令行的情况下执行此操作?在我的实际代码中有4种不同的条件,因此有很多不必要的重复。

如果我使用Bash,我会关注Bash FAQ 050并为命令参数构建一个数组,但我不是。

3 个答案:

答案 0 :(得分:2)

标准解决方法是使用位置参数代替数组。假设您不关心当前值:

shift $#  # Clear them; optional, as the next line overwrites whatever was there
set -- -argument value1
if [ "$condition" -eq 1 ]; then
  set -- "$@" "-second_argument"  "value2"
fi
external_command "$@"

如果您 关心当前值,请在子shell中运行该块:

(
  set -- -argument value1
  if [ "$condition" -eq 1 ]; then
    set -- "$@" "-second_argument"  "value2"
  fi
  external_command "$@"
)

或者,定义一个已经有自己的位置参数集的函数。

run_external () {
  condition=$1
  set -- -argument value1
  if [ "$condition" -eq 1 ]; then
    set -- "$@" -second_argument value2
  fi
  external_command "$@"
}

run_external "$condition"

答案 1 :(得分:1)

如果在第二个条件应该给出的情况下填充变量,否则不设置它,你有另一个符合POSIX的选项:

# have a variable set ONLY IF you want the extra arguments passed
if [ "$condition" -eq 1 ]; then
  unset want_extra_args
else
  want_extra_args=1
fi

# and put those arguments in a ${var+val} expansion
external_command -argument value1 ${want_extra_args+-second_argument value2}

您可以使用引号和其他扩展 - 也就是说,以下内容有效:

external_command ... ${want_extra_args+-second_argument "$value2"}

答案 2 :(得分:-1)

试试

second=
if [ "$condition" -ne 1 ]; then
    second="-second_argument value2"
fi
external_command -argument value1 $second

请注意双引号/不引用它们。 尽管user1934428是正确的,但如果您的值为-second_argument,则可能存在问题。