Shell脚本read命令报illegal option -n错误,请求代码修复帮助
修复Shell脚本中
read: Illegal option -n的问题 这个报错的核心原因是:read -n1是Bash专属的扩展语法,如果你用的是POSIX标准的sh(比如部分系统默认的Shell),它并不支持-n这个选项,就会抛出非法选项的错误。下面给你两种针对性的修复方案:
方案1:改用Bash运行脚本(最简单直接)
如果你不需要兼容POSIX Shell,只需要确保脚本用Bash解释执行即可:
- 在脚本的最顶部添加Bash的shebang声明:
#!/bin/bash - 保存脚本后,给它加上执行权限:
chmod +x your_script.sh - 直接运行脚本,或者用
bash your_script.sh命令执行,而不是sh your_script.sh
这样原脚本里的read -n1 c就能正常工作了。
方案2:兼容POSIX标准Shell(通用型)
如果你的脚本需要在严格符合POSIX标准的Shell环境下运行,可以用dd命令替代read -n1来读取单个字符:
修改后的循环部分代码如下:
count=0 # 用dd读取单个字符,同时屏蔽错误输出,删除换行符 while c=$(dd bs=1 count=1 2>/dev/null | tr -d '\n'); [ -n "$c" ] do case $c in # 这里保留你原来的匹配逻辑,比如: # 'a') ((count++)) ;; # ... 其他规则 esac done < "$file" echo "$count"
说明:
dd bs=1 count=1:每次读取1个字节(即单个字符)2>/dev/null:屏蔽dd在文件读取结束时输出的错误信息tr -d '\n':去掉dd输出的换行符,确保c变量只存储单个字符[ -n "$c" ]:当读取到的字符为空时(即文件结束),终止循环
另外还要注意两个细节:
- Shell变量名区分大小写,原脚本里的
Count=0建议改成小写count=0(符合Shell编程惯例) echo"$count"中间要加空格,改成echo "$count",否则会被解析成一个不存在的命令名导致报错
内容的提问来源于stack exchange,提问作者user9180239
相关产品推荐
相关产品推荐

