You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因分析

  1. 无用的管道赋值:cat file.txt | word=$(head -1 file.txt)完全多余,且管道会创建子shell,导致word变量在主shell中无法正确获取值(实际为空或未定义),直接用word=$(head -1 file.txt)即可。
  2. 正则匹配方式错误:用==加单引号包裹正则是精确字符串匹配,不是正则匹配。即便改成=~,单引号也会把正则转为普通字符串,Bash无法识别正则规则。
  3. 正则鲁棒性不足:原正则^[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 14:56:29