二进制字符校验异常:遍历字符均输出错误,求修正方案
修正Shell脚本的二进制字符串校验逻辑
看起来你的脚本现在的问题应该是校验逻辑写反了,或者没有正确控制“只有出现非法字符才报错”的触发条件——比如可能你在逐个字符检查时,不管字符是0/1还是其他,都错误地输出了error,或者每次循环都无条件输出提示?
下面给你两种靠谱的解决方案,按需选择:
方案1:用正则一次性校验(推荐,简洁高效)
这种方法直接用正则匹配整个输入字符串,确保从开头到结尾只包含0和1,不需要逐个字符遍历:
read -p "请输入二进制字符串: " input # 正则规则:^开头,$结尾,[01]+表示至少一个0或1(允许空输入的话把+改成*) if [[ ! "$input" =~ ^[01]+$ ]]; then echo "error: 输入包含非0/1的字符" else echo "输入合法: $input" fi
逻辑说明:
[[ "$input" =~ ^[01]+$ ]]会检查输入字符串是否完全由0和1组成- 前面加
!表示“如果不匹配这个规则”,也就是输入有非0/1字符时,才输出错误提示 - 合法输入(全0/1)会走else分支,提示正常
方案2:逐个字符检查(适合需要定位非法字符的场景)
如果你需要明确知道哪个字符非法,可以用循环遍历每个字符,但要通过标记变量控制错误输出的时机,避免每个字符都报错:
read -p "请输入二进制字符串: " input # 初始化标记:0表示合法,1表示非法 invalid=0 # 遍历字符串的每个字符 for ((i=0; i<${#input}; i++)); do # 取出第i个字符(从0开始计数) current_char=${input:i:1} # 检查是否是0或1 if [[ "$current_char" != "0" && "$current_char" != "1" ]]; then invalid=1 echo "error: 第$((i+1))个字符'$current_char'不是0或1" break # 找到非法字符就停止遍历,不用继续检查 fi done # 最后统一判断输出 if [[ $invalid -eq 0 ]]; then echo "输入合法: $input" fi
为什么原来的代码会每个字符都输出error?
大概率是你没有用标记变量,而是在循环里每次检查都输出error,或者把判断条件写反了——比如本来应该是“如果不是0/1就报错”,结果写成了“如果是0/1就报错”,导致合法字符也触发了错误提示。
内容的提问来源于stack exchange,提问作者Lexie Anne
相关产品推荐
相关产品推荐

