Bash Shell脚本读取用户输入统计字符'a'出现次数问题排查
Shell脚本统计字符出现次数实现方案
需求
编写.sh脚本完成以下逻辑:
- 读取用户输入的名字
- 通过循环逐字符遍历输入内容
- 统计输入内容中字母
a的出现次数 - 打印最终统计结果
现存问题
- 误用类Windows批处理的
read /p "Please enter some text" text语法读取输入,直接取${text[0]}会拿到完整输入字符串,无法直接获取单个字符 - 初版代码存在语法和逻辑错误,无法正常执行,初版代码如下:
#!/bin/bash echo "Please write" read b if [ ${b:${#b}-1:1} -eq 'a' ] ; then echo "Women" else echo "man" fi l=0 for (( i=0 ; i< ${#b} ; i++ )) do if [ ${b:$i:1} -eq 'a' ] ; then ((l++)) fi done echo L = $l
错误点梳理
- 比较运算符用错:
-eq是整数比较运算符,单字符匹配属于字符串比较,需要使用= - read参数写法错误:Bash中read的提示语参数是
-p(短横线开头),不是/p(斜杠开头是Windows批处理的写法) - 输出语句语法错误:
echo L = $l中等号两侧的空格会让Shell把L识别为可执行命令,触发运行报错,字符串拼接时不要在非赋值场景的等号两侧加多余空格 - 冗余逻辑:开头判断尾字符输出
Women/man的代码和统计a出现次数的核心需求无关,可直接删除 - 逐字符取数逻辑本身是对的:Bash原生支持
${变量名:起始索引:截取长度}的字符串切片语法,索引从0开始计数,不需要把字符串拆成数组就能逐字符遍历。
修正后可直接运行的代码
#!/bin/bash # 读取用户输入,-p参数直接携带提示文本 read -p "请输入名字:" input_name a_count=0 # 按索引遍历字符串的每一位 for ((i=0; i<${#input_name}; i++)) do # 截取当前索引位置的1个字符,和小写'a'做匹配 if [ "${input_name:$i:1}" = "a" ] then ((a_count++)) fi done # 输出统计结果 echo "输入的名字中字母'a'的出现次数为:$a_count"
运行示例:
控制台提示请输入名字:时输入anna
控制台输出:输入的名字中字母'a'的出现次数为:2
内容的提问来源于stack exchange,提问作者czitak
相关产品推荐
相关产品推荐

