如果 [ 是內建函數且 [[ 是關鍵字,那麼 ((?

如果 [ 是內建函數且 [[ 是關鍵字,那麼 ((?

根據這個帖子,[是內建函數且[[是關鍵字。由於它們可以被視為命令,因此[和之後的所有內容[[都被視為命令參數,並且應該用空格分隔,直到它們滿足最終參數]]]

但 的類型是什麼((

type ((

會報錯:

 bash: syntax error near unexpected token `('. 

我發現空格在裡面不相關(( ))

echo $((1+1))
echo $(( 1+1))
echo $(( 1+1 ))
echo $(( 1+  1))
echo $(( 1  +  1  ))

都一樣


概括

根據POSIX 標準文件:分組指令部分

如果以“((”開頭的字元序列會被 shell 解析為算術擴展(如果前面有“$”),則實現擴展的 shell 可以將“((表達式))”計算為算術表達式“((”作為算術求值而不是分組命令引入。

且內部的算術求值((...))符合C風格。所以空間與內部無關((...))

答案1

((不是一個字。與[and不同[[,它不是構成命令的單字清單的一部分。最好的方式是將其視為標點符號。實際上,它是兩個標點符號,根據上下文,它們可能會也可能不會組合在一個標記中。在這方面,它類似於>&和之類的東西。 ||shell 的詞法分析器/解析器以特殊方式處理標點符號。

((是運算符的一半,另一半是))。它們一起構成了算術表達式運算符,它具有「outfix」語法。 bash 等 shell 語言的語法結構並不完全遵循傳統程式語言的語法(例如,詞法分析和語法分析之間存在非常緊密的聯繫,因為標點符號的含義取決於語法上下文),因此並不總是很合適的詞。

type只能為您提供有關可以出現在簡單命令中的單字和關鍵字的信息,而不是有關 shell 的詞法分析器/解析器如何運作的信息。

相關內容