【问题标题】:variable declaration is considered as a command in bash变量声明被视为 bash 中的命令
【发布时间】:2014-05-08 09:02:52
【问题描述】:

为什么int"$((++k))"=test 被 bash 视为命令?示例:

$ int1=test
$ int"$((++k))"=test
bash: int1=test: command not found
$ 

我知道我可以使用declare int"$((++k))"=test,但为什么int"$((++k))"=test 不起作用?

【问题讨论】:

  • 这可以使用eval 解决。请注意,发送到 eval 的内容将由 shell 处理一次。
  • 您正在尝试生成变量。在bash 中,这需要eval 分配值,或间接${!var} 评估。在ksh93 中,namereftypeset -n 的别名)两者都可以。
  • bash 4.3(即将发布)还将支持带有declare -n的名称引用。

标签: bash declare


【解决方案1】:

此行为在 Shell 命令语言的 POSIX 2.10.2.7 中指定(强调我的):

如果'='前面的所有字符构成一个有效的名称(参见 IEEE Std 1003.1-2001 的基本定义卷,第 3.230 节,名称),应返回令牌 ASSIGNMENT_WORD。 (引号字符不能参与形成有效名称。

【讨论】:

    【解决方案2】:

    您可以使用eval 来解决您的变量生成问题:

    eval int$((++k))=test
    

    请注意,发送到eval 的内容将由 shell 处理一次。

    【讨论】:

      【解决方案3】:

      因为 bash grammar 需要这样做。

      <letter> ::= a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|
                   A|B|C|D|E|F|G|H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z
      
      <digit> ::= 0|1|2|3|4|5|6|7|8|9
      
      <number> ::= <digit>
                 | <number> <digit>
      
      <word> ::= <letter>
               | <word> <letter>
               | <word> '_'
               | <word> <digit>
      
      <word_list> ::= <word>
                   |  <word_list> <word>
      
      <assignment_word> ::= <word> '=' <word>
      

      【讨论】:

      • 嗯。那么letter123=123 无效? ;) 我认为应该以某种方式将数字添加到 &lt;word&gt; 的定义中,不是吗?
      • @TrueY,看来你在我参考的书中发现了一个错误。
      • -1 表示旧的、不正确的参考。该语法提到bash 2; bash3,本身现在很少见,8年前就发布了。
      • @ivg:完成&lt;word&gt;的定义即可。 | &lt;word&gt; &lt;digit&gt; 似乎就足够了。
      • @TrueY,我已经更新了语法定义。以防万一。谢谢指点!
      猜你喜欢
      • 2013-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-27
      • 2021-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多