Assigning default values to shell variables with a single command in bash
我对bash(3.00)shell脚本中的变量进行了大量测试,如果没有设置该变量,那么它将指定一个默认值,例如:
1 2 3 4 5 | if [ -z"${VARIABLE}" ]; then FOO='default' else FOO=${VARIABLE} fi |
我似乎记得在一行中这样做有一些语法,类似于三元运算符,例如:
1 | FOO=${ ${VARIABLE} : 'default' } |
(尽管我知道那不管用…)
我是疯了,还是存在这样的东西?
实际上,非常接近你发布的内容:
1 | FOO=${VARIABLE:-default} # If variable not set or null, use default. |
或者,也可以将
1 | FOO=${VARIABLE:=default} # If variable not set or null, set it to default. |
对于命令行参数:
1 | VARIABLE=${1:-DEFAULTVALUE} |
它将传递给脚本的第一个参数的值赋给
如果变量相同,则
1 | :"${VARIABLE:=DEFAULT_VALUE}" |
如果未定义,将默认值赋给变量。双引号可防止全局搜索和分词。
另请参见bash手册第3.5.3节"shell参数扩展"。
即使您可以像默认值一样使用另一个变量的值
有文件的
1 2 3 4 5 6 | #!/bin/bash variable1=$1 variable2=${2:-$variable1} echo $variable1 echo $variable2 |
运行
1 2 | first-value second-value |
运行
1 2 | first-value first-value |
见3.5.3节(外壳参数扩展)
所以在你的情况下
1 | ${VARIABLE:-default} |
回答你的问题和所有变量替换
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | echo"$\{var}" echo"Substitute the value of var." echo"$\{var:-word}" echo"If var is null or unset, word is substituted for var. The value of var does not change." echo"2- $\{var:=word}" echo"If var is null or unset, var is set to the value of word." echo"$\{var:?message}" echo"If var is null or unset, message is printed to standard error. This checks that variables are set correctly." echo"$\{var:+word}" echo"If var is set, word is substituted for var. The value of var does not change." |
还有一种方法可以更简洁地表达你的"if"结构:
1 2 | FOO='default' [ -n"${VARIABLE}" ] && FOO=${VARIABLE} |
fwiw,您可以提供这样的错误消息:
1 | USERNAME=${1:?"Specify a username"} |
这将显示类似这样的消息,并退出代码1:
1 2 | ./myscript.sh ./myscript.sh: line 2: 1: Specify a username |
更完整的例子:
1 2 3 4 5 6 7 8 | #!/bin/bash ACTION=${1:?"Specify 'action' as argv[1]"} DIRNAME=${2:-$PWD} OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}} echo"$ACTION" echo"$DIRNAME" echo"$OUTPUT_DIR" |
输出:
1 2 3 4 5 6 7 8 9 10 | $ ./script.sh foo foo /path/to/pwd /tmp $ export HOMEDIR=/home/myuser $ ./script.sh foo foo /path/to/pwd /home/myuser |
$ACTION 取第一个参数的值,如果为空则退出$DIRNAME 是第二个参数,默认为当前目录$OUTPUT_DIR 是第三个参数,或$HOMEDIR (如有定义),否则,/tmp 。这在OSX上有效,但我不确定它是便携式的。
下面是一个例子
1 2 3 4 5 6 | #!/bin/bash default='default_value' value=${1:-$default} echo"value: [$value]" |
将此保存为script.sh并使其可执行。不带参数运行
1 2 | ./script.sh > value: [default_value] |
用参数运行它
1 2 | ./script.sh my_value > value: [my_value] |