使用bash中的单个命令将默认值分配给shellvariables

我在bash(3.00)shell脚本中对variables进行了大量testing,如果未设置variables,那么它会分配一个默认值,例如:

if [ -z "${VARIABLE}" ]; then FOO='default' else FOO=${VARIABLE} fi 

我似乎记得在一行中有这样的语法,类似于三元运算符,例如:

 FOO=${ ${VARIABLE} : 'default' } 

(虽然我知道这是行不通的)

我疯了吗,还是有这样的事情存在?

非常接近您发布的内容,实际上:

 FOO=${VARIABLE:-default} # If variable not set, use default. 

或者,也会将default分配给VARIABLE

 FOO=${VARIABLE:=default} # If variable not set, set it to default. 

对于命令行参数:

 VARIABLE=${1:-DEFAULTVALUE} #set VARIABLE with the value of 1st Arg to the script, #If 1st arg is not entered, set it to DEFAULTVALUE 

如果variables是相同的,那么

 : "${VARIABLE:=DEFAULT_VALUE}" 

如果未定义,则将DEFAULT_VALUE分配给VARIABLE。 双引号可防止通配符和分词。

另请参阅Bash手册中的第3.5.3节“ shell参数扩展” 。

请参阅3.5.3(shell参数扩展)

所以在你的情况

 ${VARIABLE:−default} 

即使你可以使用像默认值的另一个variables的值

有一个文件defvalue.sh

 #!/bin/bash variable1=$1 variable2=${2:-$variable1} echo $variable1 echo $variable2 

运行./defvalue.sh first-value second-value输出

 first-value second-value 

并运行./defvalue.sh first-value输出

 first-value first-value 

那么就可以更加简洁地expression你的“if”结构:

 FOO='default' [ -n "${VARIABLE}" ] && FOO=${VARIABLE} 

这是一个例子

 #!/bin/bash default='default_value' value=${1:-$default} echo "value: [$value]" 

将其保存为script.sh并使其可执行。 运行它没有params

 ./script.sh > value: [default_value] 

用param运行它

 ./script.sh my_value > value: [my_value] 

FWIW,你可以提供这样的错误信息:

 USERNAME=${1:?"Specify a username"} 

这将显示一条消息,并以代码1退出:

 ./myscript.sh ./myscript.sh: line 2: 1: Specify a username 

一个更完整的例子:

 #!/bin/bash ACTION=${1:?"Specify 'action' as argv[1]"} DIRNAME=${2:-$PWD} OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}} echo "$ACTION" echo "$DIRNAME" echo "$OUTPUT_DIR" 

输出:

 $ ./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 。 这适用于OS X,但我不是积极的,它是可移植的。