如何在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
相关产品推荐
相关产品推荐

