【发布时间】:2015-07-02 19:06:59
【问题描述】:
我有一个使用 $1 处理命令行参数的 bash 脚本。
即使没有给出命令行参数,我也想修改此脚本以使其正常工作;在这种情况下,我希望脚本使用默认值。
我不知道该怎么做;基本上我认为我需要用我自己的变量替换$1,并在程序的开头有一行检查是否为$1 传递了一个值,如果不使用我将提供的默认值。但我不知道它的语法。谁能帮帮我?
【问题讨论】:
标签: bash command-line-arguments
我有一个使用 $1 处理命令行参数的 bash 脚本。
即使没有给出命令行参数,我也想修改此脚本以使其正常工作;在这种情况下,我希望脚本使用默认值。
我不知道该怎么做;基本上我认为我需要用我自己的变量替换$1,并在程序的开头有一行检查是否为$1 传递了一个值,如果不使用我将提供的默认值。但我不知道它的语法。谁能帮帮我?
【问题讨论】:
标签: bash command-line-arguments
var=${1:-default}
来自给定的链接:
${parameter:-word}
如果参数未设置或为空,则替换单词的扩展。 否则,参数的值被替换。
看一个例子:
$ echo "$v"
$ t=${v:-hello}
$ echo "$t"
hello
$ v=2
$ t=${v:-hello}
$ echo "$t"
2
还要注意${var:-value} 和${var-value} 不一样:What is the difference between ${var:-word} and ${var-word}?。
【讨论】:
试试:
echo "${1:-"my default"}"
在您的脚本(例如foo.sh)中查看:- 修饰符的效果。
请注意,如果您将空字符串传递给脚本,默认值也会生效:
$ ./foo.sh ""
my default
因此,您无法通过这种方式将空字符串与未给定的参数区分开来。
如果您需要区分,您应该依靠$# 告诉您参数的数量:
if [ $# = 0 ]
then
echo "my default"
else
echo "$1"
fi
=>
$ printf "[%s]\n" "$(./foo.sh "")"
[]
【讨论】:
${a-b},并认为它优于使用$#。
[ $# -eq 0 ]
(( $# > 5 )) 这样的比较,数字语法可能更容易阅读。
=,而不是-eq。
-eq、-lt 等是离合器和次优解决方案。使用=、>= 等有助于他们的视觉效果以防止错误,所以如果可能的话,我更喜欢它们。