
根據這個帖子,[
是內建函數且[[
是關鍵字。由於它們可以被視為命令,因此[
和之後的所有內容[[
都被視為命令參數,並且應該用空格分隔,直到它們滿足最終參數]
和]]
但 的類型是什麼((
?
type ((
會報錯:
bash: syntax error near unexpected token `('.
我發現空格在裡面不相關(( ))
。
echo $((1+1))
echo $(( 1+1))
echo $(( 1+1 ))
echo $(( 1+ 1))
echo $(( 1 + 1 ))
都一樣
概括
如果以“((”開頭的字元序列會被 shell 解析為算術擴展(如果前面有“$”),則實現擴展的 shell 可以將“((表達式))”計算為算術表達式“((”作為算術求值而不是分組命令引入。
且內部的算術求值((...))
符合C風格。所以空間與內部無關((...))
答案1
((
不是一個字。與[
and不同[[
,它不是構成命令的單字清單的一部分。最好的方式是將其視為標點符號。實際上,它是兩個標點符號,根據上下文,它們可能會也可能不會組合在一個標記中。在這方面,它類似於>&
和之類的東西。 ||
shell 的詞法分析器/解析器以特殊方式處理標點符號。
((
是運算符的一半,另一半是))
。它們一起構成了算術表達式運算符,它具有「outfix」語法。 bash 等 shell 語言的語法結構並不完全遵循傳統程式語言的語法(例如,詞法分析和語法分析之間存在非常緊密的聯繫,因為標點符號的含義取決於語法上下文),因此並不總是很合適的詞。
type
只能為您提供有關可以出現在簡單命令中的單字和關鍵字的信息,而不是有關 shell 的詞法分析器/解析器如何運作的信息。