Bash中{0..$#}被判定为无效变量名,求报错原因?
Bash脚本报错原因及修正方案
报错原因
Bash的**大括号扩展(Brace Expansion)**是在脚本解析的早期阶段执行的,这个阶段变量不会被展开。你写的{0..$#}无法被替换成预期的{0..2},而是被当作一个无效的变量名,因此触发invalid variable name错误。大括号扩展要求上下边界必须是明确的数字常量,不能使用变量。
修正方法
有两种常见的方式替代大括号扩展实现基于变量的循环:
方法一:C风格for循环
这种方式支持直接使用变量作为循环边界:
#!/bin/bash # 注意:如果要处理用户输入的参数,应该从1开始循环($0是脚本自身路径) for ((i=1; i<=$#; i++)); do ascii ${!i} | grep "\`" | tail -c 3 | head -c 1; done echo
方法二:使用seq命令
通过seq生成数字序列,再遍历序列:
#!/bin/bash # 同样,处理用户参数从1开始 for i in $(seq 1 $#); do ascii ${!i} | grep "\`" | tail -c 3 | head -c 1; done echo
额外提示
原脚本中循环从0开始会包含$0(即脚本自身的文件名),这不是你需要处理的二进制输入参数,所以建议循环起始值改为1,只处理用户传入的二进制字符串。
内容的提问来源于stack exchange,提问作者AnonymouseCoder
相关产品推荐
相关产品推荐

