bash 中变量的动态替换

bash 中变量的动态替换

老实说,我什至不知道如何问这个问题,或者正确的术语是什么,哈哈

所以我想做的是处理具有变量名的变量。我想我最好通过实际展示来描述它:所以我之前拥有的是这个

if [ -z ${file_var} ]; then
        echo "empty argument"
fi
if [ -z ${pw_var} ]; then
        echo "empty argument"
fi

所以我想做的不是有两个 if 语句,而是只有一个和一个 for 循环,如下所示:

for i in file_var, pw_var;do
        if [ -z ${${i}} ]; then
                echo "empty argument"
        fi
done

现在这显然行不通,所以我想知道如何正确完成。

答案1

你想做的是间接扩张,Bash 支持使用!:

if [ -z "${!i}" ] ; then

如果第一个字符为范围是感叹号 ( !),并且范围不是一个名称引用,它引入了一个间接级别。 Bash 使用通过扩展其余部分形成的值范围作为新参数;然后将其扩展,并且该值将用于扩展的其余部分,而不是原始参数的扩展。这被称为间接扩张

在这种情况下,"${!i}"扩展到变量的任何值姓名存储在 中i-z并将测试间接访问的值。


或者,一个名称引用是一种特殊类型的变量,自动具有这种行为。你使用创建 nameref 变量declare -n name,此后

对 的所有引用、赋值和属性修改name(使用或更改属性本身的除外-n)均在 的值引用的变量上执行name

所以如果你添加

declare -n i

在循环之前,这意味着

for i in file_var pw_var
do
    if [ -z "$i" ]
    then
    ...
    fi
done

会按照你想要的方式工作。但请注意作业to i(与在这样的循环中设置相反)将修改目标变量。


另请注意,您在 Bash 循环中循环的项目之间没有逗号,for就像您在问题中编写的那样。

答案2

此代码有效,如果 file_var 或 pw_var 为空,它将打印特定变量为空。您可以调整它以适合您的使用情况。

file_var=""
pw_var=""

for i in 'file_var' 'pw_var';do
  if [ -z ${!i} ]; then
    echo "$i is empty"
  fi
done

相关内容