Bash遍历数组时如何获取变量名而非变量值
解决Bash中输出变量名而非变量值的更优方案
嘿,我明白你的需求——你现在的数组只存了变量的值,丢失了和变量名的关联,想要不用额外存变量名数组的方式输出变量名,同时还能保留值用于后续操作。这里有几个更优雅的方案:
方案1:使用关联数组(最推荐)
Bash的关联数组可以直接把变量名作为键,变量值作为值,完美解决键值对应问题,既可以轻松遍历变量名,也能随时取用对应的值。
# 先定义你的变量 var1=$'1' var2=$'2' var3=$'3' # 声明一个关联数组,把变量名和值绑定 declare -A var_assoc var_assoc["var1"]=$var1 var_assoc["var2"]=$var2 var_assoc["var3"]=$var3 # 遍历关联数组的键(也就是变量名) for var_name in "${!var_assoc[@]}"; do echo "$var_name" # 后续要用到值的话,直接用 ${var_assoc[$var_name]} 即可 done
执行这个脚本,输出就是你想要的:
var1 var2 var3
这个方案的优势是逻辑清晰、可控性强,完全不用担心变量名格式的问题,后续取值也非常方便。
方案2:利用变量间接引用+精简的变量名列表(适合不想用关联数组的场景)
如果你不想用关联数组,其实可以把变量名列表写得更紧凑,结合间接引用拿到值,虽然本质还是用到了变量名列表,但写法更简洁:
var1=$'1' var2=$'2' var3=$'3' # 直接在循环里列出变量名,用间接引用取值 for var_name in var1 var2 var3; do echo "$var_name" # 取值的话用 ${!var_name} # echo "对应的值:${!var_name}" done
这个写法比单独存一个变量名数组更简洁,而且同样能输出变量名,同时通过${!var_name}获取对应的值。
不推荐的方案:通过set命令过滤
还有一种方式是用set命令输出所有变量,再过滤出你需要的变量名,但这个方案不够严谨——如果有其他同名前缀的变量,会被误匹配,而且依赖set的输出格式,只适合临时快速测试:
var1=$'1' var2=$'2' var3=$'3' # 过滤出以var开头的变量名(假设你的变量名都是var+数字格式) set | grep -E '^var[0-9]+=' | cut -d'=' -f1
总结一下,关联数组是最优解,它完美保留了变量名和值的关联,操作起来也最灵活。
内容的提问来源于stack exchange,提问作者jack rk
相关产品推荐
相关产品推荐

