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

如何在Bash中检测字符串是否以"结尾?技术求助

问题修复方案

1. 报错原因

你脚本里的[ $char = *" ]这行存在语法错误——双引号未闭合,Shell会将这个未闭合的引号视为字符串的起始标记,直到脚本结束都找不到匹配的闭合引号,因此抛出unexpected EOF错误。

另外,[(即test命令)中的=是严格字符串相等比对,无法直接用*做通配符匹配;如果需要模式匹配,应该使用Bash的[[ ... ]]结构配合==运算符。

2. 逻辑漏洞修正

你的循环中每次读取单个字符到变量c,但从未将c赋值给char,导致char始终为空,条件判断永远无法触发。

3. 修正后的脚本

场景1:检测单个双引号字符

如果你的需求是识别文件中的双引号字符,修正后的脚本如下:

char=""

while IFS='' read -n1 c; do
  # 将读取到的字符赋值给char
  char="$c"
  # 正确判断当前字符是否为双引号
  if [[ "$char" == '"' ]]; then
    echo "STRING FOUND"
    char=""
    pwd
  fi
  echo "$char"
done < "$1"

场景2:检测成对的双引号字符串

如果你的需求是识别"Hello World!"这类完整的带双引号的字符串(即成对闭合的双引号),可以改成跟踪引号状态的版本:

in_quote=0

while IFS='' read -n1 c; do
  if [[ "$c" == '"' ]]; then
    # 切换引号状态:0表示不在引号内,1表示在引号内
    in_quote=$((1 - in_quote))
    # 当引号闭合时触发提示
    if [[ $in_quote -eq 0 ]]; then
      echo "STRING FOUND: 双引号闭合"
      pwd
    fi
  fi
  # 若处于引号内,可收集字符做后续处理
  if [[ $in_quote -eq 1 ]]; then
    echo "当前引号内字符: $c"
  fi
done < "$1"

关键修改点

  • 用[[ "$char" == '"' ]]替代错误的[ $char = *" ],正确匹配双引号字符
  • 新增char="$c",让char能获取每次读取到的字符
  • 给输入文件变量$1添加双引号,避免文件名包含空格时出错
  • 若需检测包含双引号的字符串,可使用[[ "$string" == *"\""* ]]格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 04:27:31