Bash
如果 [ 是內置函式, [[ 是關鍵字,那麼 ((?
根據這篇文章,
[
是一個內置的,[[
是一個關鍵字。由於它們可以被視為命令,因此[
和之後的所有內容都[[
被視為命令參數,並且應該用空格分隔,直到它們遇到最後的參數]
和]]
但是 的類型是
((
什麼?type ((
會報錯:
bash: syntax error near unexpected token `('.
我發現裡面的空格是不相關的
(( ))
。echo $((1+1)) echo $(( 1+1)) echo $(( 1+1 )) echo $(( 1+ 1)) echo $(( 1 + 1 ))
都一樣
概括
如果以 “((” 開頭的字元序列如果前面有一個 ‘$’ 會被 shell 解析為算術擴展,那麼實現擴展的 shell 將 “((expression))” 計算為算術表達式可以將“((”作為算術評估而不是分組命令引入。符合要求的應用程序應確保它用空格分隔兩個前導“(”字元,以防止外殼執行算術評估。
並且裡面的算術評估
((...))
符合C風格。所以空間在內部是不相關的((...))
((
不是一個詞。與[
and不同[[
,它不是構成命令的單詞列表的一部分。最好的理解方式是標點符號。實際上,它是兩個標點符號,根據上下文可能會或可能不會組合成一個標記。在這方面,它類似於類似的>&
事情||
。標點符號由 shell 的詞法分析器/解析器以一種特殊的方式處理。
((
是運算符的一半,另一半是))
. 它們一起構成了算術表達式運算符,該運算符具有“後綴”語法。shell 語言(如 bash)的語法結構並沒有非常整齊地遵循傳統的程式語言語法(例如,詞法分析和語法解析之間有很強的聯繫,因為標點符號的含義取決於語法上下文),所以有並不總是很貼切的詞。
type
只能為您提供有關可以出現在簡單命令中的單詞和關鍵字的資訊,而不是有關 shell 的詞法分析器/解析器如何工作的資訊。