我在bash(3.00)shell脚本中对变量进行了大量测试,如果未设置变量,则会分配默认值,例如:
if [ -z "${VARIABLE}" ]; then
FOO='default'
else
FOO=${VARIABLE}
fi
我似乎记得在一行中有一些语法,类似于三元运算符,例如:
FOO=${ ${VARIABLE} : 'default' }
(虽然我知道这不起作用......)
我疯了,还是有类似的东西存在?
答案 0 :(得分:959)
非常接近您发布的内容,实际上:
FOO=${VARIABLE:-default} # If variable not set or null, use default.
或者,也会将default
分配给VARIABLE
:
FOO=${VARIABLE:=default} # If variable not set or null, set it to default.
答案 1 :(得分:219)
对于命令行参数:
VARIABLE=${1:-DEFAULTVALUE}
如果没有传递这样的参数,则将VARIABLE
分配给传递给脚本的第一个参数的值或DEFAULTVALUE
的值。
答案 2 :(得分:189)
如果变量相同,那么
: "${VARIABLE:=DEFAULT_VALUE}"
如果未定义,将DEFAULT_VALUE分配给VARIABLE。双引号可防止通配和分词。
另请参阅Bash手册中的第3.5.3节Shell Parameter Expansion。
答案 3 :(得分:30)
即使您可以使用其他变量
的默认值拥有文件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
答案 4 :(得分:23)
答案 5 :(得分:15)
回答你的问题和所有变量替换
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 "$\{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."
答案 6 :(得分:13)
然后有更简洁地表达你的'if'结构的方式:
FOO='default'
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}
答案 7 :(得分:13)
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,但我并不认为它是可移植的。答案 8 :(得分:9)
这是一个例子
#!/bin/bash
default='default_value'
value=${1:-$default}
echo "value: [$value]"
将其保存为script.sh并使其可执行。 在没有参数的情况下运行它
./script.sh
> value: [default_value]
使用param运行它
./script.sh my_value
> value: [my_value]