首页 文章

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

提问于
浏览
459

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

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

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

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

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

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

9 回答

  • 21

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

    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.
    
  • 11

    对于命令行参数:

    VARIABLE=${1:-DEFAULTVALUE}
    

    如果没有传递这样的参数,则为 VARIABLE 分配传递给脚本的第一个参数的值或 DEFAULTVALUE 的值 .

  • 195

    如果变量相同,那么

    : "${VARIABLE:=DEFAULT_VALUE}"
    

    如果未定义,则将DEFAULT_VALUE分配给VARIABLE . 双引号可防止通配和分词 .

    另请参阅Bash手册中的第3.5.3节,Shell Parameter Expansion .

  • 814

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

    有一个文件 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
    
  • 8

    见3.5.3下的here(shell参数扩展)

    所以在你的情况下

    ${VARIABLE:−default}
    
  • 13

    然后就是更简洁地表达你的'if'结构的方式:

    FOO='default'
    [ -n "${VARIABLE}" ] && FOO=${VARIABLE}
    
  • 163

    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 是第3个参数,或 $HOMEDIR (如果已定义),否则为 /tmp . 这适用于OS X,但我是便携式的 .

  • 23

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

    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."
    
  • 9

    这是一个例子

    #!/bin/bash
    
    default='default_value'
    value=${1:-$default}
    
    echo "value: [$value]"
    

    将其保存为script.sh并使其可执行 . 没有params运行它

    ./script.sh
    > value: [default_value]
    

    用param运行它

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

相关问题