应如何处理变量扩展产生的反斜杠?

2024-01-11

我运行了以下命令(*sh是一个名字sh实现)以及我能找到的所有 shell;虽然我期待所有的打印match,我得到了不一致的结果。我不知道哪种行为是正确的、可靠的。

*sh -c 'case "$1" in $2) echo match; esac' _ 'f\oo' 'f\\oo'

With 来自 Ubuntu Bionic 仓库的 dash https://packages.ubuntu.com/bionic/dash(和 ash;这是破折号的符号链接)

$ dash -c 'case "$1" in $2) echo match; esac' _ 'f\oo' 'f\\oo'
match

使用 bash 4.4.20(1)-release (x86_64-pc-linux-gnu) 和 5.0.11(1)-release (arm-unknown-linux-androideabi)

$ bash -c 'case "$1" in $2) echo match; esac' _ 'f\oo' 'f\\oo'
match

使用 ksh 版本 AJM 93u+ 2012-08-01 和版本 JM 93t+ 2010-03-05(预装 SunOSomniosce 5.11)

$ ksh -c 'case "$1" in $2) echo match; esac' _ 'f\oo' 'f\\oo'
match

使用 ksh @(#)PD KSH v5.2.14 99.07.13.2(OpenBSD 6.6 上的默认 shell,以及它的Linux端口 https://github.com/dimkr/loksh/)

$ ksh -c 'case "$1" in $2) echo match; esac' _ 'f\oo' 'f\\oo'
$

使用 lksh @(#)LEGACY KSH R56 2018/01/14、mksh @(#)MIRBSD KSH R56 2018/01/14(这些是 Ubuntu bionic 上的不同二进制文件)和 mksh @(#)MIRBSD KSH R57 2019/03 /01

$ lksh -c 'case "$1" in $2) echo match; esac' _ 'f\oo' 'f\\oo'
$ mksh -c 'case "$1" in $2) echo match; esac' _ 'f\oo' 'f\\oo'
$ 

与豪华 0.13.1

$ posh -c 'case "$1" in $2) echo match; esac' _ 'f\oo' 'f\\oo'
$ 

与雅什2.46

$ yash -c 'case "$1" in $2) echo match; esac' _ 'f\oo' 'f\\oo'
$ 

并使用 zsh 5.4.2 (x86_64-ubuntu-linux-gnu) 和 5.7.1 (arm-unknown-linux-androideabi);模仿sh

$ zsh -c 'emulate sh; case "$1" in $2) echo match; esac' _ 'f\oo' 'f\\oo'
match

And I'm lost in POSIX's Shell Command Language specification https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18; couldn't find a straightforward answer to my question yet: How should an escaped backslash resulting from a variable expansion be interpreted in a glob pattern? As \\ or as \? Or is it unspecified?


Under Case Conditional Construct https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_04_05 it says:

按照从 case 语句的开头到结尾的顺序,每个pattern标记复合列表的标签应进行波形符扩展、参数扩展、命令替换和算术扩展,并且这些扩展的结果应根据中描述的规则与单词的扩展进行比较模式匹配表示法 https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13 (它还描述了引用模式部分的效果)

请注意,它并没有说模式会被引用删除;而是说模式会被删除。但在模式匹配表示法下,它说:

字符应转义后面的字符。转义的 将被丢弃

但它并没有澄清当该模式是扩展的结果时是否仍然会发生这种情况。


对于任何感兴趣的人来说,该标准对此并不清楚;不过他们会在新版本中修改它。以下是 POSIX 错误报告的一些链接,其中广泛讨论了该问题。

  • 0001234:在大多数 shell 中,反斜杠在模式匹配方面没有两个含义 https://www.austingroupbugs.net/view.php?id=1234
  • 0001190:反斜杠在 shell 中有两种特殊含义,在括号表达式中只丢失其中之一 https://www.austingroupbugs.net/view.php?id=1190
  • 0000985:case 语句模式和替代扩展中缺少引号删除 https://www.austingroupbugs.net/view.php?id=985

也许这一点参考可以澄清你的问题。来自POSIX 的 Shell 命令语言规范 - 模式匹配表示法 https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18该条款规定,

2.13.1 匹配单个字符的模式

A <backslash>字符应转义后面的字符。逃脱者<backslash>应被丢弃。如果模式以未转义结尾<backslash>,未指定模式是否不匹配任何内容或模式被视为无效

上述规则适用于使用case语句以及使用时==全局匹配运算符bash using test构造。

所以自从你的$2在进行模式匹配时保持不带引号,字面值f\\oo永远丢失并被解释为f\oo.

为了澄清问题,shell 在删除引号期间保留了您的文字值,并且仅当在此模式匹配规则中应用传递的参数时,就会表现出这种行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应如何处理变量扩展产生的反斜杠? 的相关文章

随机推荐

  • 如何将特定的可变“订单”保存到数据库中

    假设我有一些对象 并且我希望用户能够以他们希望的任何方式对它们重新排序 例如通过拖动它们 所以我会有 Cheese Muffins Milk 然后用户将 牛奶 拖到顶部 进行新订单 Milk Cheese Muffins 是否有最佳实践如何
  • 嵌套 JSON 对象 - 我是否必须使用数组来处理所有事情?

    有没有什么方法可以在 JSON 中嵌套对象 这样我就不必用所有东西制作数组 为了正确解析我的对象 我似乎需要这样的结构 data stuff onetype id 1 name John Doe id 2 name Don Joeh oth
  • djangorest框架更新序列化器中的方法,实例不会立即保存

    要更新的实例有 email protected cdn cgi l email protection 电子邮件要更新或更改为 email protected cdn cgi l email protection UserUpdateSeri
  • 如何获取所有带有特色图片的 WordPress 帖子?

    WordPress 3 中有特色图片功能 如何获取所有带有特色图片的帖子 这是我当前的自定义循环 loop new WP Query array posts per page gt 15 这应该有效 loop new WP Query ar
  • Javascript 事件处理和流程控制

    我正在尝试构建一个根据提供的输入加载的网页 基本上 我在 javascript 中的事件处理方面遇到了一些麻烦 来自 python 如果我想在继续显示下一个对象之前等待特定的键盘输入 我会创建一个while循环并在其中放置一个关键侦听器 P
  • MapKit 显示整个地球

    我正在尝试在 MKMapView 中绘制整个地球仪 通过捏合缩小 我只能缩小到一定程度 我希望能够缩小到这个级别以上 以在地图上显示整个地球 这似乎不是很困难 但我一直找不到任何解决方案 里面的地图MKMapView不会在侧面重复 因此您无
  • 将 CSV 文件的内容加载到数组而不打开文件[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要将 6000 多个 csv 文件整理成一个 csv 文档 目前的VBA流程是 1 打开单独的CSV数据文件 2 根据行数将文件内
  • 如何在 Chutzpah 的无头浏览器中使用 templateUrl 测试指令

    有谁知道如何让像 Chutzpah 的 Visual Studio 测试适配器这样的无头浏览器允许指令访问其 html 模板文件 Chutzpah 使用 PhantomJS 作为无头浏览器 这似乎限制了我的选择 我正在使用 Chutzpah
  • azure apim中的JWT验证失败错误

    我目前正在尝试使用以下文档实施 Oauth2 0 来保护 API https learn microsoft com en us azure api management api management howto protect backe
  • 您在实体框架中发现的最烦人的功能(或缺乏功能)是什么?

    我从实体框架开始 听起来不错 但我想知道我是否应该留意某个地方的弱点 那里有什么经验吗 您可能需要开始在这些问题前加上您正在讨论的版本的前缀 NET 4 0 即将发布的版本中已经修复了大量的烦恼 这是我在使用第一个版本大约 6 个月后在 s
  • 当触发新管道时取消之前的管道 GitHub Actions

    我遇到了拦截器 我确信其他人一定也遇到过这个问题 所以只需检查是否有任何解决方法 这是一个 Github 工作流程示例 name Test Build on pull request types opened synchronize reo
  • Flutter 能否消除使用 Mac 创建 IOS 应用程序的需要?

    所以我想构建 Android 和 IOS 应用程序 有一天我发现了 flutter 我知道 IOS 需要 MacOS 但 flutter 可以在 Windows 上运行 我的问题是 我可以使用flutter在Windows计算机上开发和发布
  • 文件存在时 os.rename 不会引发 FileExistsError

    我有一个file rename我想通过一个简单的改进机制try except块将检查重命名的文件是否已存在于目录中 我在我的目录中准备了2个文件 data txt and old data txt 函数应该抛出异常 如下所示old data
  • LoadLibraryW() 无法加载 System32 中的 DLL

    我尝试使用以下代码加载 C Windows System32 文件夹中与打印机驱动程序一起安装的 DLL LoadLibraryW L C Windows System32 MagAPI dll GetLastError 报告 找不到指定的
  • 在没有 cron 的情况下在 AWS 中运行计划任务

    目前我在亚马逊有一台服务器 我把所有的 cronjobs 都放在里面 我想消除这个单点故障 并将所有任务公开为 Web 服务 我想将 VPC ELB 背后的服务公开给一些服务器 这些服务器将在调用时运行任务 Amazon AWS 是否提供某
  • 在驱动程序安装期间重新扫描设备树以了解硬件更改

    我在用着安装盾安装我的应用程序 驱动程序和服务 仅当在设备管理器中找到其硬件 ID 时 我才需要安装即插即用驱动程序 驱动程序安装是使用 DPInst exe 完成的 我的问题是 用户有时可以手动卸载驱动程序 安装后甚至卸载驱动程序 未知司
  • 在Http get请求上调用Https url

    我有一个https 网址并希望发送请求以从该 URL 获取数据 场景 1 从我的浏览器如果我点击 Url 我会得到响应 而从我的 Angularjs 应用程序我总是得到错误 401 但如果我从浏览器点击 Api 我总是得到正确的响应 出于安
  • Python-停止 FuncAnimation

    有谁知道停止 FuncAnimation 的首选方法 我正在使用它来记录示波器中的数据 并且希望能够按需暂停和重新启动数据 有什么方法可以向其发送按钮单击事件吗 谢谢 德里克 The FuncAnimation是一个子类TimedAnima
  • 将一个类中的值绑定到另一类中的另一个值

    我有以下课程课程要点 https gist github com anonymous 9306399 我想将 Item Visible 绑定到 Items ItemsVisible 可能吗 如果可以 如何 Item cs using Sys
  • 应如何处理变量扩展产生的反斜杠?

    我运行了以下命令 sh是一个名字sh实现 以及我能找到的所有 shell 虽然我期待所有的打印match 我得到了不一致的结果 我不知道哪种行为是正确的 可靠的 sh c case 1 in 2 echo match esac f oo f