使用bash中的单个命令为shell变量分配默认值

Assigning default values to shell variables with a single command in bash

我对bash(3.00)shell脚本中的变量进行了大量测试,如果没有设置该变量,那么它将指定一个默认值,例如:

1
2
3
4
5
if [ -z"${VARIABLE}" ]; then
    FOO='default'
else
    FOO=${VARIABLE}
fi

我似乎记得在一行中这样做有一些语法,类似于三元运算符,例如:

1
FOO=${ ${VARIABLE} : 'default' }

(尽管我知道那不管用…)

我是疯了,还是存在这样的东西?


实际上,非常接近你发布的内容:

1
FOO=${VARIABLE:-default}  # If variable not set or null, use default.

或者,也可以将default分配给VARIABLE

1
FOO=${VARIABLE:=default}  # If variable not set or null, set it to default.


对于命令行参数:

1
VARIABLE=${1:-DEFAULTVALUE}

它将传递给脚本的第一个参数的值赋给VARIABLE,如果没有传递该参数,则赋给DEFAULTVALUE的值。


如果变量相同,则

1
:"${VARIABLE:=DEFAULT_VALUE}"

如果未定义,将默认值赋给变量。双引号可防止全局搜索和分词。

另请参见bash手册第3.5.3节"shell参数扩展"。


即使您可以像默认值一样使用另一个变量的值

有文件的

1
2
3
4
5
6
#!/bin/bash
variable1=$1
variable2=${2:-$variable1}

echo $variable1
echo $variable2

运行./defvalue.sh first-value second-value输出

1
2
first-value
second-value

运行./defvalue.sh first-value输出

1
2
first-value
first-value


见3.5.3节(外壳参数扩展)

所以在你的情况下

1
${VARIABLE:-default}

回答你的问题和所有变量替换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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"2- $\{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."


还有一种方法可以更简洁地表达你的"if"结构:

1
2
FOO='default'
[ -n"${VARIABLE}" ] && FOO=${VARIABLE}


fwiw,您可以提供这样的错误消息:

1
USERNAME=${1:?"Specify a username"}

这将显示类似这样的消息,并退出代码1:

1
2
./myscript.sh
./myscript.sh: line 2: 1: Specify a username

更完整的例子:

1
2
3
4
5
6
7
8
#!/bin/bash
ACTION=${1:?"Specify 'action' as argv[1]"}
DIRNAME=${2:-$PWD}
OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}}

echo"$ACTION"
echo"$DIRNAME"
echo"$OUTPUT_DIR"

输出:

1
2
3
4
5
6
7
8
9
10
$ ./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。这在OSX上有效,但我不确定它是便携式的。

下面是一个例子

1
2
3
4
5
6
#!/bin/bash

default='default_value'
value=${1:-$default}

echo"value: [$value]"

将此保存为script.sh并使其可执行。不带参数运行

1
2
./script.sh
> value: [default_value]

用参数运行它

1
2
./script.sh my_value
> value: [my_value]