在变量周围加上引号

时间:2018-03-07 15:18:46

标签: bash shell

如果变量不为空,我想在变量周围加上引号。 所以我在for循环中得到了这个并且想要一个else语句,如果我想稍后回调它,将$ var放在引号中。 语法如何?

for var in var1 var2 var3 var4; do
    eval 'val=$'"$var"
        if [ -z "$val" ]; then
            eval "${var}=null"
        fi
done

1 个答案:

答案 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 -veval更安全,但它是bash扩展程序。如果您需要POSIX兼容性,请继续使用eval "$var=..."(包含所有需要的危险)。