使用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,但我不是积极的,它是可移植的。