Bash

如果 [ 是內置函式, [[ 是關鍵字,那麼 ((?

  • April 29, 2017

根據這篇文章[是一個內置的,[[是一個關鍵字。由於它們可以被視為命令,因此[和之後的所有內容都[[被視為命令參數,並且應該用空格分隔,直到它們遇到最後的參數]]]

但是 的類型是((什麼?

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 將 “((expression))” 計算為算術表達式可以將“((”作為算術評估而不是分組命令引入。符合要求的應用程序應確保它用空格分隔兩個前導“(”字元,以防止外殼執行算術評估。

並且裡面的算術評估((...))符合C風格。所以空間在內部是不相關的((...))

((不是一個詞。與[and不同[[,它不是構成命令的單詞列表的一部分。最好的理解方式是標點符號。實際上,它是兩個標點符號,根據上下文可能會或可能不會組合成一個標記。在這方面,它類似於類似的>&事情||。標點符號由 shell 的詞法分析器/解析器以一種特殊的方式處理。

((是運算符的一半,另一半是)). 它們一起構成了算術表達式運算符,該運算符具有“後綴”語法。shell 語言(如 bash)的語法結構並沒有非常整齊地遵循傳統的程式語言語法(例如,詞法分析和語法解析之間有很強的聯繫,因為標點符號的含義取決於語法上下文),所以有並不總是很貼切的詞。

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

引用自:https://unix.stackexchange.com/questions/361436