Bash脚本始终执行else分支,无法触发then分支求助
Bash脚本判断首行首单词元音开头问题修复
问题情况
我编写了一个Bash脚本,需求是读取file.txt文件,判断首行首个单词是否以元音(AaEeIiOoUu)开头:若是则将文件前10行输出到words.txt,否则输出前15行。但实际运行时,无论输入文件首行是否以元音开头,脚本始终执行else分支输出前15行。
原脚本如下:
#!/bin/bash cat file.txt | word=$(head -1 file.txt) if [[ "$word" == '^[AaEeIiOoUu]' ]] then head -10 file.txt > words.txt else head -15 file.txt > words.txt fi
示例输入file.txt内容:
island bus carriage train tractor
错误原因分析
- 无用的管道赋值:
cat file.txt | word=$(head -1 file.txt)完全多余,且管道会创建子shell,导致word变量在主shell中无法正确获取值(实际为空或未定义),直接用word=$(head -1 file.txt)即可。 - 正则匹配方式错误:用
==加单引号包裹正则是精确字符串匹配,不是正则匹配。即便改成=~,单引号也会把正则转为普通字符串,Bash无法识别正则规则。 - 正则鲁棒性不足:原正则
^[AaEeIiOoUu]仅匹配首字符为元音,若首行开头有空白字符会直接失效。
修正后的脚本
#!/bin/bash # 获取文件首行内容 first_line=$(head -1 file.txt) # 判断首行首个非空白字符是否为元音 if [[ "$first_line" =~ ^[[:space:]]*[AaEeIiOoUu] ]]; then head -10 file.txt > words.txt else head -15 file.txt > words.txt fi
修正说明
- 移除了多余的管道命令,直接通过命令替换获取首行内容,确保变量在当前shell中正确赋值。
- 使用
=~进行正则匹配,且去掉正则表达式的单引号,让Bash正确解析正则规则。 - 正则开头添加
[[:space:]]*,兼容首行开头有空格或制表符的情况,提升脚本鲁棒性。 - 变量名改为
first_line,语义更清晰,明确变量存储的是文件首行内容。
内容的提问来源于stack exchange,提问作者Arawelo
相关产品推荐
相关产品推荐

