爲什麼int"$((++k))"=test
被bash視爲命令?例如:變量聲明被認爲是bash中的命令
$ int1=test
$ int"$((++k))"=test
bash: int1=test: command not found
$
我知道,我可以使用declare int"$((++k))"=test
,但爲什麼不int"$((++k))"=test
工作?
爲什麼int"$((++k))"=test
被bash視爲命令?例如:變量聲明被認爲是bash中的命令
$ int1=test
$ int"$((++k))"=test
bash: int1=test: command not found
$
我知道,我可以使用declare int"$((++k))"=test
,但爲什麼不int"$((++k))"=test
工作?
因爲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>
此行爲是在POSIX 2.10.2.7指定在外殼命令語言(重點煤礦):
如果所有前面的「=」形成一個有效名(見的基本定義體積的字符IEEE標準1003.1-2001,章節3.230,名稱),應該返回令牌ASSIGNMENT_WORD。 (引用的字符不能參與形成一個有效的名稱)
您可以使用eval
像下面解決與可變代您的問題:
eval int$((++k))=test
注意什麼發送到eval
將被處理一次由殼。
這是可以使用'eval'解決的。請注意,發送給'eval'的內容將由shell處理一次。 – Jite
您正在嘗試*生成*變量。在[tag:bash]中,在賦值時需要'eval',或者在評估時需要間接'$ {!var}'。在[tag:ksh] 93中,'nameref'(typeset -n'的別名)可以兼得。 –
'bash' 4.3(待發布)也將支持'declare -n'的名稱參考。 – chepner