如果变量不为空,我想在变量周围加上引号。 所以我在for循环中得到了这个并且想要一个else语句,如果我想稍后回调它,将$ var放在引号中。 语法如何?
for var in var1 var2 var3 var4; do
eval 'val=$'"$var"
if [ -z "$val" ]; then
eval "${var}=null"
fi
done
答案 0 :(得分:1)
你根本不需要eval
。而是使用间接参数扩展和:=
参数扩展运算符。
# Works in 4.4, but not in earlier versions
for var in var1 var2 var3 var4; do
: ${!var:=null}
done
但是,我发现重复分配的列表更易于阅读和维护(以及符合POSIX标准)。
: ${var1:=null}
: ${var2:=null}
: ${var3:=null}
: ${var4:=null}
忘记了引号后,我又回到使用printf
来处理动态分配。
for var in var1 var2 var3 var4; do
oldVal="${!var}"
if [ -z "$oldVal" ]; then
newVal=null
else
newVal=\"$oldVal\"
fi
printf -v "$var" '%s' "$newVal"
done
printf -v
比eval
更安全,但它是bash
扩展程序。如果您需要POSIX兼容性,请继续使用eval "$var=..."
(包含所有需要的危险)。