我有一个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并为命令参数构建一个数组,但我不是。
答案 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,则可能存在问题。