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

编写捕获CTRL-C的Bash脚本遇功能异常,求排查解决

修复Bash脚本的问题与解决方案

原脚本的核心问题

  • 逻辑顺序错误:先执行cat $z再判断是否输入"quit",导致输入quit时会尝试读取名为quit的文件,而非直接退出
  • 字符串比较误用数值运算语法:((z == "quit"))是数值运算判断,不适合字符串比较,会触发语法错误
  • 行匹配逻辑完全错误:错误地判断文件名$z是否以b开头,而非目标文件中的每行;且匹配规则写法无效,无法识别b/B开头的行
  • 缺少文件合法性校验:未检查输入的文件是否存在、是否可读,遇到无效文件会直接报错
  • 打印星号的echo -e "*\c"兼容性差,部分环境下无法实现不换行打印

修正后的脚本

#!/bin/bash

# 处理CTRL-C信号的函数
handle_int() {
    read -p "Enter a filename [enter quit to quit]: " input

    # 判断是否输入quit,直接退出脚本
    if [[ "$input" == "quit" ]]; then
        echo -e "\nExiting script..."
        exit 0
    fi

    # 检查文件是否存在且可读
    if [[ ! -f "$input" || ! -r "$input" ]]; then
        echo -e "\nError: File '$input' does not exist or is not readable."
        return  # 返回主循环继续执行
    fi

    # 读取文件,筛选并输出以b/B开头的行
    while read -r line; do
        if [[ "$line" =~ ^[bB] ]]; then
            echo "$line"
        fi
    done < "$input"
}

# 捕获CTRL-C信号,触发处理函数
trap handle_int INT

# 主循环:每2秒打印一个不换行的星号
while true; do
    printf "*"
    sleep 2
done

关键修改说明

  • 调整逻辑优先级:先判断quit输入,再处理文件操作,避免无效的文件读取行为
  • 正确使用字符串比较:用[[ ... ]]语法进行字符串判断,替代错误的数值运算语法
  • 修复行匹配规则:针对文件中的每行$line,用正则表达式^[bB]精准匹配以b或B开头的行
  • 增加文件校验:通过-f和-r选项检查文件的存在性与可读性,避免无意义报错
  • 优化打印方式:用printf "*"替代echo -e "*\c",提升跨环境兼容性
  • 提升代码可读性:将模糊的函数名f1改为handle_int,变量名z改为input,增强代码可维护性

内容的提问来源于stack exchange,提问作者Polus

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 08:05:29