代码之家  ›  专栏  ›  技术社区  ›  Edward Q. Bridges

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

  •  499
  • Edward Q. Bridges  · 技术社区  · 15 年前

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

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

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

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

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

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

    9 回复  |  直到 6 年前
        1
  •  882
  •   Mihai Capotă    6 年前

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

    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.
    
        2
  •  209
  •   Rodrigue    7 年前

    对于命令行参数:

    VARIABLE=${1:-DEFAULTVALUE}    
    

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

        3
  •  176
  •   jww    7 年前

    如果变量相同,则

    : "${VARIABLE:=DEFAULT_VALUE}"
    

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

    另见第3.5.3节, Shell Parameter Expansion ,在bash手册中。

        4
  •  28
  •   Montells    10 年前

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

    有文件 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
    
        5
  •  22
  •   ghostdog74    15 年前

    看见 here 3.5.3(壳体参数扩展)

    所以在你的情况下

    ${VARIABLE:−default}
    
        6
  •  13
  •   Rob Wells    15 年前

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

    FOO='default'
    [ -n "${VARIABLE}" ] && FOO=${VARIABLE}
    
        7
  •  11
  •   Curtis Mattoon    7 年前

    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 . 这在OSX上有效,但我不认为它是可移植的。
        8
  •  11
  •   Guru    6 年前

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

    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
  •  9
  •   Assaf Shomer    8 年前

    下面是一个例子

    #!/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]