检查是否设置了变量,否则将属性设置为默认值

时间:2016-07-01 13:39:30

标签: bash variables default-value

我有一串要检查的变量,以及一串默认值,如下所示:

variables_to_check="name surname address"
variables_default_values="John Doe Paris"

以下是我想做的事情:

  1. 检查是否设置了$ name,如果没有,请将John作为值
  2. 检查是否设置了$ surname,如果没有,请将Doe作为值
  3. ...
  4. 以下是我目前的非工作代码:

    variables_to_check="name surname address"
    variables_default_values="John Doe Paris"
    i=0
    for variable in $variables_to_check
    do
        ((i++))
        if [[ -z ${"$variable"+x} ]] #this line doesn't seem to work
                                     #inspired from http://stackoverflow.com/questions/3601515
        then
            default=$(echo $variables_default_values | cut -d " " -f $i)
            set_config $variable $default
            declare "$variable=$default" #this doesn't seem to work either
                                         #inspired from http://stackoverflow.com/questions/16553089
        fi
    done
    

    非常感谢任何帮助

3 个答案:

答案 0 :(得分:1)

使用-v运算符确定是否设置了变量。如果使用数组来存储名称和默认值,这也会容易得多。

variables=(name surname address)
default_values=(John Doe "somewhere in Paris")

for ((i=0; i < ${#variables[@]}; i++)); do
    if ! [[ -v ${variables[i]} ]]; then
        declare "${variables[i]}=${default_values[i]}"
    fi
done

bash -v需要4.3或更高版本才能使用数组。

Namerefs(也在4.3中引入)可以使这更简单:

for ((i=0; i < ${#variables[@]}; i++)); do
    declare -n name=${variables[i]}
    [[ -v name ]] && name=${default_values[i]}"
done

除非以编程方式生成变量和默认值列表,否则一点点重复将更易读,并且实际上难以维护:

# This will also work in any POSIX-compliant shell, not just
# in a sufficiently new version of bash
: ${name:=John}
: ${surname:=Doe}
: ${address:=somewhere in Paris}

答案 1 :(得分:1)

您可以使用&#34; namerefs&#34;这样做:

variables=( a b c d e )
c=1
d=7

value=42

declare -n var

for var in ${variables[@]}; do
    if [[ ! -v var ]]; then
        var=$value
    fi
done

echo $a, $b, $c, $d, $e

运行它:

$ bash script.sh
42, 42, 1, 7, 42

在循环中,var变量是对数组variables中命名的变量的名称引用,这意味着您可以使用var 作为命名变量。

使用-v查看变量是否已设置,如果未设置,则为其指定值。整个if语句也可以用单行代替

: ${var:=$value}

:是一个无操作的命令,用于评估其参数,并且参数的评估具有副作用,即如果未设置,shell会为变量var赋值。

编辑:以下内容相同,但每个变量都有不同的默认值:

variables=( a b c d e )
defaults=( 1 2 3 4 5 )

c=1
d=7

for (( i = 0; i < ${#variables[@]}; ++i )); do
        declare -n var="${variables[$i]}"
        value="${defaults[$i]}"

        : ${var:=$value}
done

echo $a, $b, $c, $d, $e

运行它:

$ bash script.sh
1, 2, 1, 7, 5

答案 2 :(得分:0)

shell有一些可爱的字符串替换运算符可以做到这一点,但是有第三种可能性你没有在上面列出:变量设置为值&#34;&#34;。

Expression     "var Set not Null"   "var Set but Null"  "var Unset"
${var-DEFAULT}      var                 null             DEFAULT    
${var:-DEFAULT}     var                 DEFAULT          DEFAULT
${var=DEFAULT}      var                 null             DEFAULT    
${var:=DEFAULT}     var                 DEFAULT          DEFAULT    
${var+OTHER}        OTHER               OTHER            null   
${var:+OTHER}       OTHER               null             null   

所以在你的情况下,你会想要这样的东西:

${name:-"John"}   # or ${name:="John"} 
${surname:-"Doe"} # or ${surname:="Doe"}

等等。