gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 03:03:56 29 4
gpt4 key购买 nike

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

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

dash from Ubuntu bionic's repo (和 ash;它是 dash 的符号链接(symbolic link))
$ 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(预装 SunOS omniosce 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 和 its Linux port )
$ 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 仿生上的不同二进制文件)和 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'
$

使用 yash 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

我迷失在 POSIX's Shell Command Language specification †;还没有找到我的问题的直接答案: 应该如何在全局模式中解释由变量扩展产生的转义反斜杠?如\\或作为 \ ? 还是未指定?

† 在 Case Conditional Construct 下它说:

In order from the beginning to the end of the case statement, each pattern that labels a compound-list shall be subjected to tilde expansion, parameter expansion, command substitution, and arithmetic expansion, and the result of these expansions shall be compared against the expansion of word, according to the rules described in Pattern Matching Notation (which also describes the effect of quoting parts of the pattern)



请注意,它并没有说模式会受到引号删除;但在模式匹配符号下,它说:

A <backslash> character shall escape the following character. The escaping <backslash> shall be discarded



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

对于任何感兴趣的人,标准都不清楚;不过,他们会在更新的版本中对其进行修改。下面是一些指向 POSIX 错误报告的链接,其中广泛讨论了这个问题。
  • 0001234: in most shells, backslash doesn't have two meaning wrt pattern matching
  • 0001190: backslash has two special meanings in the shell and only loses one of them in bracket expressions
  • 0000985: quote removal missing from case statement patterns and alternative expansions
  • 最佳答案

    也许这一点引用可以为您的问题解决问题。来自 POSIX's Shell Command Language specification - under Pattern Matching Notation该条款规定,

    2.13.1 Patterns Matching a Single Character

    A <backslash> character shall escape the following character. The escaping <backslash> shall be discarded. If a pattern ends with an unescaped <backslash>, it is unspecified whether the pattern does not match anything or the pattern is treated as invalid


    上述规则适用于使用 case 的模式。语句和使用 ==bash 中的全局匹配运算符使用 test构造。
    所以自从你的 $2在进行模式匹配时保持不加引号, f\\oo 的文字值永远丢失并被解释为 f\oo .
    只是为了澄清问题,shell 在引号删除期间保留了您的文字值,并且在此模式匹配规则中应用传递的参数时,会显示此行为。

    关于shell - 应该如何处理由变量扩展产生的反斜杠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59348035/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com