Bash for循环使用seq遍历未打印首个对象问题求解
Bash for循环遍历位置参数遗漏首个元素问题分析与解决
问题原因
- 核心逻辑偏差:
$(seq ${1} $END)的作用是生成以第一个位置参数的实际值为起始、23为结束的连续数字序列,并将这些数字直接赋值给循环变量,完全没有读取对应序号位置参数的逻辑,和你预期遍历$1到$23位置参数的需求不匹配。 - 首个元素遗漏的直接诱因:你运行脚本时传入的第一个参数值为2,因此
seq ${1} 23实际执行的是seq 2 23,生成的序列从2开始,自然缺失了你预期的第一个参数对应取值,和输出中首个匹配值为2的现象吻合。
解决方法
方法1:通过间接引用遍历指定序号的位置参数(兼容所有Bash版本)
先通过seq生成1~23的序号序列,再用间接引用语法取对应序号的位置参数值:
#!/bin/bash countOuter=0 countInner=0 END=23 # 先生成1到23的序号序列,而非用第一个参数的值作为序列起点 for idx in $(seq 1 $END) do # 间接引用:取第idx个位置参数的值赋值给bool bool=${!idx} countOuter=$((countOuter+1)) # 后续业务逻辑 done
方法2:大括号扩展写法(Bash 4.0及以上版本支持,无需调用外部seq命令)
#!/bin/bash countOuter=0 countInner=0 for idx in {1..23} do bool=${!idx} countOuter=$((countOuter+1)) # 后续业务逻辑 done
方法3:遍历所有传入的位置参数(无数量限制,兼容带空格的参数)
如果你不需要严格限制只取前23个位置参数,直接使用"$@"遍历所有传入参数是最稳妥的写法:
#!/bin/bash countOuter=0 countInner=0 for bool in "$@" do countOuter=$((countOuter+1)) # 后续业务逻辑 done
内容的提问来源于stack exchange,提问作者Vesselin Tonchev
相关产品推荐
相关产品推荐

