我在bash (3.00) shell脚本中有一大堆关于变量的测试,如果变量没有设置,那么它会分配一个默认值,例如:
if [ -z "${VARIABLE}" ]; then
FOO='default'
else
FOO=${VARIABLE}
fi
我似乎记得在一行中做这件事有一些语法,类似于三元运算符,例如:
FOO=${ ${VARIABLE} : 'default' }
(虽然我知道这行不通……)
是我疯了吗,还是真的有这样的东西存在?
我在bash (3.00) shell脚本中有一大堆关于变量的测试,如果变量没有设置,那么它会分配一个默认值,例如:
if [ -z "${VARIABLE}" ]; then
FOO='default'
else
FOO=${VARIABLE}
fi
我似乎记得在一行中做这件事有一些语法,类似于三元运算符,例如:
FOO=${ ${VARIABLE} : 'default' }
(虽然我知道这行不通……)
是我疯了吗,还是真的有这样的东西存在?
当前回答
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(如果有定义),else, /tmp。这适用于OS X,但我不确定它是否可移植。
其他回答
这里有一个例子
#!/bin/bash
default='default_value'
value=${1:-$default}
echo "value: [$value]"
将其保存为script.sh并使其可执行。 不带参数运行它
./script.sh
> value: [default_value]
用参数运行它
./script.sh my_value
> value: [my_value]
对于命令行参数:
VARIABLE="${1:-$DEFAULTVALUE}"
它将传递给脚本的第一个参数的值赋给VARIABLE,如果没有传递这样的参数,则将DEFAULTVALUE的值赋给VARIABLE。引用可以防止词缀和分词。
其实跟你贴出来的很像。您可以使用Bash参数展开来实现这一点。
获取指定的值,如果缺少则默认:
FOO="${VARIABLE:-default}" # If variable not set or null, use default.
# If VARIABLE was unset or null, it still is after this (no assignment done).
或者同时将default赋值给VARIABLE:
FOO="${VARIABLE:=default}" # If variable not set or null, set it to default.
参见这里的3.5.3(shell参数展开)
所以在你的案例中
${VARIABLE:-default}
还有一种更简洁地表达“if”结构的方法:
FOO='default'
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}