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

时间:2010-01-06 14:29:31

标签: bash shell

我在bash(3.00)shell脚本中对变量进行了大量测试,如果未设置变量,则会分配默认值,例如:

if [ -z "${VARIABLE}" ]; then 
    FOO='default'
else 
    FOO=${VARIABLE}
fi

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

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

(虽然我知道这不起作用......)

我疯了,还是有类似的东西存在?

9 个答案:

答案 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)

请参阅3.5.3(shell参数扩展)下的here

所以在你的情况下

${VARIABLE:-default}

答案 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]