我对bash(3.00)shell脚本中的变量进行了一大堆测试,如果未设置变量,则它会分配一个默认值,例如:
if [ -z "${VARIABLE}" ]; then
FOO='default'
else
FOO=${VARIABLE}
fi
我似乎记得有一些语法可以在一行中执行此操作,类似于三元运算符,例如:
FOO=${ ${VARIABLE} : 'default' }
(虽然我知道那行不通……)
我疯了,还是存在类似的东西?
实际上,非常接近您发布的内容。您可以使用名为 Bash parameter expansion 的东西来完成此操作。
要获取分配的值,或者如果缺少 default
:
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.
对于命令行参数:
VARIABLE="${1:-$DEFAULTVALUE}"
它将传递给脚本的第一个参数的值分配给 VARIABLE
,如果没有传递这样的参数,则分配 DEFAULTVALUE
的值。引用可以防止通配符和分词。
如果变量相同,则
: "${VARIABLE:=DEFAULT_VALUE}"
如果未定义,则将 DEFAULT_VALUE
分配给 VARIABLE
。
内置冒号 (:) 确保不执行变量结果
双引号 (") 可防止通配符和分词。
另请参阅 Bash 手册中的第 3.5.3 节,Shell Parameter Expansion。
HISTTIMEFORMAT
: ${FOO:=DEFAULT1} ${BAR:=DEFAULT2}
export
中使用类似的东西吗?我想让这个变量可用于从当前脚本调用的脚本。
回答您的问题和所有变量替换
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."
您可以通过在美元符号和表达式的其余部分之间放置一个 \ 来转义整个表达式。
echo "$\{var}"
{var-default}
,其中 default
仅在 var
未定义时使用。如果定义了 var
但为 null,则不会使用 default
。
即使您可以使用默认值,也可以使用另一个变量的值
有一个文件 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
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,但我不肯定它是可移植的。
然后是更简洁地表达你的“if”结构的方法:
FOO='default'
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}
这是一个例子
#!/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]
可以像这样链接默认值:
DOCKER_LABEL=${GIT_TAG:-${GIT_COMMIT_AND_DATE:-latest}}
即如果 $GIT_TAG
不存在,取 $GIT_COMMIT_AND_DATE
- 如果这不存在,取 "latest"