Bash中利用间接引用处理数组的更优雅写法:合并代码至循环行
把数组间接引用逻辑直接嵌入for循环的优化方案
嘿,没问题!你完全可以把构建数组引用的那行代码直接合并到for循环里,去掉中间的myCorrectVar变量。我来给你两种可行的方案,还会解释背后的逻辑:
先回顾你的原始需求
你现在的代码通过间接引用遍历数组,功能正常,但想精简结构:
#!/bin/bash # 注:你的代码用到了bash独有的${var^^}和数组间接引用,建议把#!/bin/sh改成#!/bin/bash更稳妥 myVar_ANIMAL=("fish" "dog" "emu") myPrefix="myVar" mySuffix="animal" mySearch="${mySuffix}" myCorrectVar="${myPrefix}_${mySearch^^}[@]" for i in "${!myCorrectVar}" do echo "animal = $i" done
这段代码能正确输出:
animal = fish animal = dog animal = emu
方案一:直接嵌入参数展开(推荐)
bash支持在间接引用里直接做变量拼接,所以你可以把myCorrectVar的逻辑直接写到for循环的参数里:
#!/bin/bash myVar_ANIMAL=("fish" "dog" "emu") myPrefix="myVar" mySuffix="animal" mySearch="${mySuffix}" # 直接把变量名拼接+间接引用嵌入for循环 for i in "${!${myPrefix}_${mySearch^^}[@]}" do echo "animal = $i" done
为什么这能行?
${mySearch^^}:bash的参数展开语法,把mySearch里的小写字符串转成大写,也就是把animal变成ANIMAL。${myPrefix}_${mySearch^^}:拼接出目标数组的名字myVar_ANIMAL。${!...[@]}:bash的间接数组引用语法,...部分是我们拼接出来的数组名,加上[@]表示引用数组的所有元素,还能保留元素里的空格(如果有的话)。
方案二:用eval实现(兼容旧版bash)
如果你的bash版本比较老(比如3.x之前),上面的直接拼接可能不生效,那可以用eval来实现:
#!/bin/bash myVar_ANIMAL=("fish" "dog" "emu") myPrefix="myVar" mySuffix="animal" mySearch="${mySuffix}" # 用eval拼接数组引用并执行循环 eval 'for i in "${'"${myPrefix}_${mySearch^^}"'[@]}"; do echo "animal = $i"; done'
⚠️ 注意:eval要谨慎使用,如果myPrefix或mySuffix来自不可信的输入(比如用户输入),可能会有代码注入风险,所以优先用方案一。
内容的提问来源于stack exchange,提问作者art vanderlay
相关产品推荐
相关产品推荐

