编写捕获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
相关产品推荐
相关产品推荐

