AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1531532
Accepted
MIke
MIke
Asked: 2024-10-30 08:44:19 +0800 CST2024-10-30 08:44:19 +0800 CST 2024-10-30 08:44:19 +0800 CST

为什么 bash 不报告行尾没有 " 的错误

  • 772

我的问题是为什么 bash 没有针对第 2 行进行报告,我故意在行末留下了尾随的“以查看它是如何报告这一点的。

我运行一个 bash 脚本并收到此错误:./test: 第 4 行:查找匹配的“”时出现意外的 EOF

#!/usr/bin/bash
echo "this is life
echo "now is the time"
echo "have we reached the end"
bash
  • 1 1 个回答
  • 43 Views

1 个回答

  • Voted
  1. Best Answer
    kos
    2024-10-30T11:00:32+08:002024-10-30T11:00:32+08:00

    因为该行不包含错误,因为在引号字符串中包含换行符是完全合法的。

    事实上,任何字符(但未转义的",标记引用字符串的开始/结束)都可以包含在引用字符串中,如果以某种方式“放”在字符后面;换行符恰好很容易输入(就像任何“普通”字母字符一样),并且 - 值得注意的是 - 甚至不是可以包含在引用字符串1"中的最奇特的东西。

    我建议您摆脱字符串只能包含字母、数字和标点符号的思维定势,因为它根本不是这样的,而且意识到这一点对使用命令行/脚本很有帮助。

    无论如何,更重要的是,这里是对发生的事情以及为什么您仅在第 4 行收到错误通知的细分:

    • Bash 解析第 2 行直到该"字符;它开始将其后的内容解释为字符串,并且当它偶然发现(如上所述,合法的)换行符时,它会愉快地接受它并开始解析第 3 行作为字符串的延续,该字符串到目前为止包括该"字符后面的内容,其中包括换行符;
    • Bash 解析第 3 行直到第一个"字符;现在第一个字符串已正确且完整地解析。然后它将该行的其余部分解析为(合法的)未加引号的字符串,直到"找到下一个字符,此时循环重复:它偶然发现了(如上所述,合法的)换行符,它愉快地接受它并开始解析第 4 行作为字符串的延续,到目前为止仅包含换行符;
    • 同样,Bash 解析第 4 行直到第一个"字符;第二个字符串现在已正确且完整地解析。然后,它将该行的其余部分解析为(合法的)未加引号的字符串,直到"找到下一个字符,此时循环中断;它偶然发现了(同样,如上所述,合法的)换行符,它愉快地吞下它并且... 没有什么可解析的了/已到达 EOF(文件结束)。由于已到达 EOF,最后解析的肯定没有匹配的结束引号 -​​ 因此会抛出"错误unexpected EOF while looking for matching `"'

    事实上,例如,如果将任何其他不可打印字符(ASCII 范围 0-31 - 而不仅仅是这些)粘贴在“”字符之后,它们也可以包含在字符串中。它们实际上与换行符没有什么不同 - 它们都是不可打印的字符 - 恰好换行符可以简单地输入。不可打印字符的另一个例外是制表符,它与换行符非常相似,也可以简单地输入。
    • 3

相关问题

  • 同时复制到两个位置

  • 如何在 shell 脚本中创建选择菜单?

  • 从 bash 迁移到 zsh [关闭]

  • bashrc 还是 bash_profile?

  • 备份 bash 脚本未压缩其 tarball

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve