变量声明在bash中被视为命令
为什么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|
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
2bash
3是8年前发布的,现在很少见。@ivg:只需完成
的定义即可。一个|
似乎就足够了。@TrueY,我已经更新了语法定义。以防万一。谢谢你的指点!