我在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' }
(虽然我知道这行不通……)
是我疯了吗,还是真的有这样的东西存在?
当前回答
如果变量相同,则
: "${VARIABLE:=DEFAULT_VALUE}"
如果没有定义,则将DEFAULT_VALUE赋值给VARIABLE。
内置冒号(:)确保不执行变量结果 双引号(")可以防止通配符和分词。
参见Bash手册中的章节3.5.3,Shell参数扩展。
其他回答
如果你想在If -then-else语句中使用一行代码,那么我们可以考虑重写:
if [ -z "${VARIABLE}" ]; then
FOO='default'
else
FOO=${VARIABLE}
fi
分号:
if [ -z ${VARIABLE} ]; then FOO=`default`; else FOO=${VARIABLE}; fi
或者,如果你使用布尔操作符,你可以删除if-then-else-fi关键字,例如:
[ -z "${VARIABLE}" ] && FOO='default' || FOO=${VARIABLE}
概括来说,布尔运算符模式是:
conditional && then_command || else_command
这里有一个例子
#!/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。引用可以防止词缀和分词。
参见这里的3.5.3(shell参数展开)
所以在你的案例中
${VARIABLE:-default}
可以像这样链接默认值:
DOCKER_LABEL=${GIT_TAG:-${GIT_COMMIT_AND_DATE:-latest}}
例如,如果$GIT_TAG不存在,则取$GIT_COMMIT_AND_DATE -如果不存在,则取"latest"