变量声明在bash中被视为命令

变量声明在bash中被视为命令,bash,declare,Bash,Declare,为什么bash将int“$(++k))=test视为一个命令?例如: $ int1=test $ int"$((++k))"=test bash: int1=test: command not found $ 我知道我可以使用declare int“$(++k))=test,但是为什么int“$(++k))=test不起作用呢?因为bash需要这样做 <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|

为什么bash将
int“$(++k))=test
视为一个命令?例如:

$ int1=test
$ int"$((++k))"=test
bash: int1=test: command not found
$ 
我知道我可以使用
declare int“$(++k))=test
,但是为什么
int“$(++k))=test
不起作用呢?

因为bash需要这样做

<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>
:=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 | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
::= 0|1|2|3|4|5|6|7|8|9
::= 
|  
::= 
|  
|  '_'
|  
::= 
|   
::=  '=' 

此行为在Shell命令语言(emphasis mine)中指定:

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


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

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

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

这可以使用
eval
解决。请注意,发送到
eval
的内容将由shell处理一次。您正在尝试生成变量。在这种情况下,赋值时需要
eval
,或求值时需要间接
${!var}
。在93中,
nameref
(typeset的别名-n)可以同时执行这两项操作。
bash
4.3(即将发布)还将支持带有
declare-n
.Hmmm的name refs。那么
letter123=123
无效?;)我想数字应该以某种方式添加到
的定义中,不是吗?@TrueY,看起来你在我参考的书中发现了一个错误。-1表示旧的、不正确的参考。该语法提到了
bash
2
bash
3是8年前发布的,现在很少见。@ivg:只需完成
的定义即可。一个
|
似乎就足够了。@TrueY,我已经更新了语法定义。以防万一。谢谢你的指点!