老实说,我什至不知道如何问这个问题,或者正确的术语是什么,哈哈
所以我想做的是处理具有变量名的变量。我想我最好通过实际展示来描述它:所以我之前拥有的是这个
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