我有一串要检查的变量,以及一串默认值,如下所示:
variables_to_check="name surname address"
variables_default_values="John Doe Paris"
以下是我想做的事情:
以下是我目前的非工作代码:
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
非常感谢任何帮助
答案 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"}
等等。