Bash新手求助:如何实现可动态变更变量序号并检查值的最简while循环
实现自动遍历序号变量的Bash循环
嘿,作为Bash新手,你的思路其实挺不错的——想让循环自动适配新增的变量,不用每次改循环逻辑。不过原代码里有几个逻辑问题,咱们一步步修正它:
原代码的问题点
- 变量引用错误:
var=var$x只是把字符串"var1"赋值给var,没有拿到var1的实际值,得用间接引用 - 循环条件和变量初始化位置错了:
x=1放在循环里会每次重置,永远停在x=1;循环的结束条件也不对 - 函数和循环的闭合语法错误,
done的位置完全不对
方法一:用间接引用实现你的原始思路
如果坚持用var1、var2这种命名方式,可以用Bash的间接引用(${!varname})来获取变量值,修正后的代码如下:
var1='something' var2='something else' var3='maybe nothing but probably something' run() { local x=1 # 循环直到对应的变量为空 while true; do # 构造变量名,比如var1、var2 local varname="var$x" # 间接引用获取变量的实际值 local varvalue="${!varname}" # 如果变量为空,退出循环 if [[ -z "$varvalue" ]]; then break fi # 这里写你的逻辑,比如检查变量值对应的命令是否存在 if ! command -v "$varvalue" &> /dev/null; then echo "命令 $varvalue 不存在,执行自定义操作" # 替换成你实际要执行的DO SOMETHING fi x=$((x+1)) done } # 调用函数 run
方法二:更推荐用数组(Bash最佳实践)
其实在Bash里,处理这种有序的变量集合,数组是更直观、更好维护的方式——不用手动编号,新增元素直接加在数组里就行,循环逻辑也更简洁:
# 定义数组,直接把所有要检查的内容放进去 commands_to_check=( 'something' 'something else' 'maybe nothing but probably something' ) run() { # 遍历数组里的每个元素 for cmd in "${commands_to_check[@]}"; do if ! command -v "$cmd" &> /dev/null; then echo "命令 $cmd 不存在,执行自定义操作" # 替换成你实际要执行的DO SOMETHING fi done } # 调用函数 run
这种方式的好处是:以后要新增检查项,直接在数组里加一行就行,完全不用改循环逻辑,比序号变量的方式清爽多了~
内容的提问来源于stack exchange,提问作者Bryan
相关产品推荐
相关产品推荐

