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
    • 最新
    • 标签
主页 / computer / 问题 / 1684456
Accepted
jxhyc
jxhyc
Asked: 2021-10-29 20:29:37 +0800 CST2021-10-29 20:29:37 +0800 CST 2021-10-29 20:29:37 +0800 CST

bash shell 是否会不一致地解释引号的使用?

  • 772

这是我的代码,我在 2014 年中期更新到最新版本的 Macbook Pro 上。我使用 Bash 5.1.8

apples-MacBook-Pro:Documents apple$ egrep s* states.txt
apples-MacBook-Pro:Documents apple$ egrep "s*" states.txt
Alabama
Alaska
Arizona
Arkansas
California
Colorado
Connecticut
Delaware
Florida
Georgia
Hawaii
Idaho
Illinois
Indiana
Iowa
Kansas
Kentucky
Louisiana
Maine
Maryland
Massachusetts
Michigan
Minnesota
Mississippi
Missouri
Montana
Nebraska
Nevada
New Hampshire
New Jersey
New Mexico
New York
North Carolina
North Dakota
Ohio
Oklahoma
Oregon
Pennsylvania
Rhode Island
South Carolina
South Dakota
Tennessee
Texas
Utah
Vermont
Virginia
Washington
West Virginia
Wisconsin
Wyoming
apples-MacBook-Pro:Documents apple$ egrep s{2} states.txt
Massachusetts
Mississippi
Missouri
Tennessee
apples-MacBook-Pro:Documents apple$ egrep "s{2}" states.txt
Massachusetts
Mississippi
Missouri
Tennessee

如您所见,如果我不引用 s*,egrep 不会解释元字符 *,(我假设它将 * 视为文字?)但如果我引用 s,则它被视为元字符,正如预期的那样. 但是,使用 {} 的情况并非如此,无论我是否引用了正则表达式,它都被 shell 解释为元字符。

为什么会出现差异?

linux bash
  • 1 1 个回答
  • 39 Views

1 个回答

  • Voted
  1. Best Answer
    user1686
    2021-10-29T20:59:54+08:002021-10-29T20:59:54+08:00

    如您所见,如果我不引用 s*,egrep 不会解释元字符 *,(我假设它将 * 视为文字?)但如果我引用 s,则它被视为元字符,正如预期的那样

    如果你不引用s*, egrep 甚至不会接收元字符*,因为通配符在命令执行之前由 bash 扩展——这是文件通配符在 Unix shell 中工作的通常方式。

    由于您有一个与此通配符匹配的文件(完全相同的 states.txt),因此 bash 将运行的实际命令是. (当然,如果有更多以 's' 开头的文件,它们将作为附加参数包含在内。)egrep states.txt states.txt

    只有当通配符不匹配任何文件时,它才会被原封不动地传递给程序(例如xnughxkrtb*,可能会保持原样)。您可以通过添加前缀来找出实际的命令echo——因为通配符扩展是由 shell 完成的,所以对于 echo 和 egrep 来说也是一样的。

    另一方面,如果您确实引用了s*, egrep 会完全按照书面形式收到它。(虽然在 egrep 中它不是通配符,而是正则表达式,它可以匹配所有内容,因为任何字符串都有“零个或多个”'s' 字符,这就是它输出所有状态的原因。)

    shell 还可以识别\抑制特殊字符,因此egrep s\* states.txt也可以。(如果您希望 egrep 本身从字面上接收反斜杠,您可能需要将其加倍。)

    但是,使用 {} 的情况并非如此,无论我是否引用了正则表达式,它都被 shell 解释为元字符。

    这几乎是相同的情况,{}是另一种类型的外壳扩展。但是,在您的情况下,它碰巧仍然可以不加引号地工作,因为这种类型的 shell 扩展不会触发,除非它至少有两个逗号分隔的项目(或一个范围)。也就是说,{a,b}或者{a..z}由 bash 扩展,但{a}单独不是。

    例如,如果您尝试s{2,5}不使用引号,则 shell会扩展它,并且生成的命令将是. (同样,您可以通过先使用来检测到这一点。)egrep s2 s5 states.txtecho

    • 2

相关问题

  • Notify-发送窗口下出现的通知

  • 以 root 身份运行 docker 容器

  • 如何在域和 Linux 活动目录中启用指纹传感器

  • 如何在CentOS 7 中将Ctrl+C 永久更改为Ctrl+K?

  • 如何从 WSL 打开 office 文件

Sidebar

Stats

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

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve