Bash脚本问题:检查变量数组赋值的循环判断失效
问题分析与解决方案
我来帮你搞定这个问题——你的check函数里的判断条件之所以失效,核心原因是你现在检查的是变量名本身的字符串,而不是对应变量实际存储的值!
为什么原来的代码不对?
当你把arr=(name city state country)里的元素传到函数后,循环中的$var拿到的是"name"、"city"这些字符串文本,而不是$name、$city的实际值。
举个例子:当循环到name时,[ -z $var ]其实是在检查字符串"name"是否为空——显然它不是空的,所以不管$name有没有值,都会判定为"available"。这就是为什么所有变量都显示可用的原因。
修复方案(两种方法)
方法1:使用bash的间接引用语法 ${!var}
bash支持${!var}这种语法,它的作用是获取变量名为$var的那个变量的值,安全又直观,是推荐的解决方案。修复后的函数如下:
function check { arr=("$@") for var in "${arr[@]}"; do if [ -z "${!var}" ] ; then echo "$var is not available" else echo "$var is available" fi done }
方法2:使用eval(不推荐,存在安全风险)
如果你需要兼容更老的shell,可以用eval来间接获取变量值,但要注意:如果传入的变量名不可信,可能会导致恶意代码执行的风险,所以仅在可控场景下使用:
function check { arr=("$@") for var in "${arr[@]}"; do # 用eval获取对应变量的值 eval "current_val=\$$var" if [ -z "$current_val" ] ; then echo "$var is not available" else echo "$var is available" fi done }
测试验证
运行你的测试代码:
name="abc" city="xyz" arr=(name city state country) check "${arr[@]}"
输出结果会和你预期的完全一致:
name is available city is available state is not available country is not available
内容的提问来源于stack exchange,提问作者pradeep
相关产品推荐
相关产品推荐

