2014-05-08 44 views
1

爲什麼int"$((++k))"=test被bash視爲命令?例如:變量聲明被認爲是bash中的命令

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

我知道,我可以使用declare int"$((++k))"=test,但爲什麼不int"$((++k))"=test工作?

+0

這是可以使用'eval'解決的。請注意,發送給'eval'的內容將由shell處理一次。 – Jite

+2

您正在嘗試*生成*變量。在[tag:bash]中,在賦值時需要'eval',或者在評估時需要間接'$ {!var}'。在[tag:ksh] 93中,'nameref'(typeset -n'的別名)可以兼得。 –

+0

'bash' 4.3(待發布)也將支持'declare -n'的名稱參考。 – chepner

回答

-1

因爲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> 
+0

嗯。那麼'letter123 = 123'無效? ;)我認爲編號應該加到''的定義中,不是嗎? – TrueY

+0

@TrueY,看起來你已經在我所引用的書中發現了一個錯誤。 – ivg

+0

-1表示舊的錯誤參考。該語法提到「bash」2; 'bash' 3,現在很少見,在8年前發佈。 – chepner

3

此行爲是在POSIX 2.10.2.7指定在外殼命令語言(重點煤礦):

如果所有前面的「=」形成一個有效名(見的基本定義體積的字符IEEE標準1003.1-2001,章節3.230,名稱),應該返回令牌ASSIGNMENT_WORD。 (引用的字符不能參與形成一個有效的名稱

1

您可以使用eval像下面解決與可變代您的問題:

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

注意什麼發送到eval將被處理一次由殼。