编写统计特殊字符的Bash脚本遇疑问:配对符号计数相关问题
Bash脚本符号统计工具:调试脚本符号缺失问题
你正在编写的这个脚本非常实用——通过统计代码中各类成对符号的出现次数,能快速定位脚本里可能存在的符号缺失问题(比如括号不匹配、引号没闭合这类常见bug)。先把你的代码整理成可读性更好的格式:
# 设置默认计数变量 a=0; b=0; cc=0; d=0; e=0; f=0; g=0; h=0; i=0; j=0 # 用十六进制转义定义单引号和双引号,避免语法冲突 squote=`echo -e "\x27"` dquote=`echo -e "\x22"` # 逐字符读取文件内容并统计符号 while IFS= read -r -n1 c; do [ "$c" == "[" ] && (( a++ )) [ "$c" == "]" ] && (( b++ )) [ "$c" == "(" ] && (( cc++ )) # 这里应该还有其他符号的统计逻辑,比如 )、{、}、引号、反引号、// 等 done
关于你提到的几个疑问点:
为什么用
cc作为左括号(的计数变量?
你循环里已经用了变量c来存储每次读取的单个字符(read -n1 c),如果再用c作为左括号的计数变量,就会覆盖循环里的字符值,导致统计逻辑完全错误。用cc是一种简单的命名方式,既关联了“括号(parenthesis)”的首字母,又避免了和循环变量c冲突,是很实用的小技巧。为什么用
echo -e "\x27"定义单引号?
在Bash中,直接给变量赋值单引号会有语法问题:比如quote='''会被Shell解析成未闭合的单引号,触发语法错误。而\x27是单引号的ASCII十六进制表示(ASCII码39),echo -e会解析这个转义字符,输出真正的单引号,这样就能安全地把单引号存储到变量squote里,后续判断字符时直接用"$c" == "$squote"就不会有语法冲突了。双引号的\x22也是同样的道理(ASCII码34)。
另外补充两个小建议:
- 可以给变量起更有意义的名字,比如把
a改成left_bracket,b改成right_bracket,cc改成left_parenthesis,这样脚本可读性会高很多,后期维护也更方便。 - 统计双斜杠
//的时候要注意,它是两个连续的/,不能像单个字符那样逐字符判断,需要额外处理——比如可以维护一个前一个字符的变量,当当前字符是/且前一个字符也是/时,再增加计数。
内容的提问来源于stack exchange,提问作者user312288
相关产品推荐
相关产品推荐

