【问题标题】:Is there a syntactical difference between single and double quoted empty strings?单引号和双引号空字符串在语法上有区别吗?
【发布时间】:2023-02-07 21:36:46
【问题描述】:

根据 bash 手册,没有语法差异。另一方面,bash-parser 在处理算术表达式时似乎对此有不同的看法:

$ echo "$BASH_VERSION"
5.2.15(1)-release
$ echo $((""))
0
$ echo $((''))
bash: '': syntax error: operand expected (error token is "''")

有关的:

【问题讨论】:

  • 标记化和评估在算术表达式中的工作方式似乎略有不同,这并不特定于空字符串。比较echo $(( 1, '0' ))echo $(( 1, "0" ))(特别注意错误信息)。
  • $(( espression )) 表达式进行与双引号内相同的扩展,但表达式中的双引号字符未被特殊处理并被删除。所以它应该像“''”和阅读shell-expansion我发现:执行这些扩展后,原始单词中存在的引号字符将被删除,除非它们自己被引用(引号删除)。这可以解释为什么评估单引号。
  • (error token is "'0' ") 有趣的是,它将 ' 之后的空格作为令牌的一部分。我想知道 POSIX 怎么说。
  • @Lety 如果您将其添加为答案,那么我将删除我的。我只是偶然发现了同样的事情。
  • @kvantour 完成了,谢谢

标签: bash


【解决方案1】:

似乎有细微的差别。手册指出:

(( expression ))

算术表达式根据下面描述的规则求值(参见 Shell Arithmetic)。表达式经历了与双引号内相同的扩展,但是expression 中的双引号字符不经特殊处理即被删除。如果表达式的值不为零,则返回状态为 0;否则返回状态为 1。

来源:Bash Reference Manual: Section Conditional Constructs

这意味着 (("")) 等同于 (())(('')) 是一个语法错误,因为单引号没有从 expression 中删除。

【讨论】:

  • 这是 (( 算术表达式,类似于 if (( stuff ))。在$((...))算术扩张有 "undergoes... quote removal` 和 quote removal 应该删除单引号。这使得它更加混乱,算术表达式和扩展有不同的文档。
  • @KamilCuk 但 if 语句中的 (( ))$(()) 中的不一样吗?类似于if command?在 CLI 上你也可以做 % (( v=1+1 )) 但如果你想替换它,你必须做 echo val=$((1+1))
【解决方案2】:

正如手册所述,这似乎是一个错误

表达式中的所有标记都经过参数和变量扩展、命令替换和引号删除。

【讨论】:

    【解决方案3】:

    探索不同的壳牌品牌如何处理这个问题

    • bash 版本 5.1-6
    • 破折号版本 0.5.11
    • ksh93 版本 1.0.0~beta.2
    • zsh 版本 5.8.1

    Ksh93 似乎表现出最独特的行为。

    #!/usr/bin/env sh
    
    for shell in bash dash ksh93 zsh; do
      printf 'Testing with %s:
    ' "$shell"
      "$shell" <<'EOF'
    LC_ALL=C
    echo "$((''))"
    EOF
      echo
    done
    

    输出:

    Testing with bash:
    bash: line 2: '': syntax error: operand expected (error token is "''")
    
    Testing with dash:
    ash: 2: arithmetic expression: expecting primary: "''"
    
    Testing with ksh93:
    39
    
    Testing with zsh:
    zsh: bad math expression: illegal character: '
    

    【讨论】:

      猜你喜欢
      • 2011-01-05
      • 2011-03-27
      相关资源
      最近更新 更多