shell中的括號

2021-06-28 09:32:42 字數 2259 閱讀 2861

一、括號、圓括號()

1、單小括號。

①命令組。括號中的命令將會新開乙個子shell順序執行,所以括號中的變數不能夠被指令碼餘下的部分使用。括號中多個命令之間用分號隔開,最後乙個命令可以沒有分號,各命令和括號之間不必有空格。

②命令替換。等同於`cmd`,shell掃瞄一遍命令列,發現了$(cmd)結構,便將$(cmd)中的cmd執行一次,得到其標準輸出,再將此輸出放到原來命令。有些shell不支援,如tcsh。

③用於初始化陣列。如:array=(a b c d)

2、雙小括號。

①整數擴充套件。這種擴充套件計算是整數型的計算,不支援浮點型。((exp))結構擴充套件並計算乙個算術表示式的值,如果表示式的結果為0,那麼返回的退出狀態碼為1,或者 是"假",而乙個非零值的表示式所返回的退出狀態碼將為0,或者是"true"。若是邏輯判斷,表示式exp為真則為1,假則為0。

②只要括號中的運算子、表示式符合c語言運算規則,都可用在$((exp))中,甚至是三目運算子。作不同進製(如二進位制、八進位制、十六進製制)運算時,輸出結果全都自動轉化成了十進位制。如:echo $((16#5f)) 結果為95 (16進製轉十進位制)

③單純用 (( )) 也可重定義變數值,比如 a=5; ((a++)) 可將 $a 重定義為6

④雙括號中的變數可以不使用$符號字首。括號內支援多個表示式用逗號分開。

二)中括號、方括號

1、單中括號。

①bash 的內部命令,[和test是等同的。如果我們不用絕對路徑指明,通常我們用的都是bash自帶的命令。if/test結構中的左中括號是呼叫test的命令標識,右中括號是關閉條件判斷的。這個命令把它的引數作為比較表示式或者作為檔案測試,並且根據比較的結果來返回乙個退出狀態碼。if/test結構中並不是必須右中括號,但是新版的bash中要求必須這樣。

②test和中可用的比較運算子只有==和!=,兩者都是用於字串比較的,不可用於整數比較,整數比較只能使用-eq,-gt這種形式。無論是字串比較還是整數比較都不支援大於號小於號。如果實在想用,對於字串比較可以使用轉義形式,如果比較"ab"和"bc":[ ab \< bc ],結果為真,也就是返回狀態為0。[ ]中的邏輯與和邏輯或使用-a 和-o 表示。

③字元範圍。用作正規表示式的一部分,描述乙個匹配的字元範圍。作為test用途的中括號內不能使用正則。

④在乙個array 結構的上下文中,中括號用來引用陣列中每個元素的編號。

2、雙中括號。

①[[是 bash 程式語言的關鍵字。並不是乙個命令,[[ ]] 結構比[ ]結構更加通用。在[[和]]之間所有的字元都不會發生檔名擴充套件或者單詞分割,但是會發生引數擴充套件和命令替換。

②支援字串的模式匹配,使用=~操作符時甚至支援shell的正規表示式。字串比較時可以把右邊的作為乙個模式,而不僅僅是乙個字串,比如[[ hello == hell? ]],結果為真。[[ ]] 中匹配字串或萬用字元,不需要引號。

③使用[[ ... ]]條件判斷結構,而不是[ ... ],能夠防止指令碼中的許多邏輯錯誤。比如,&&、||、《和》 操作符能夠正常存在於[[ ]]條件判斷結構中,但是如果出現在[ ]結構中的話,會報錯。

④bash把雙中括號中的表示式看作乙個單獨的元素,並返回乙個退出狀態碼。

三)大括號、花括號{}

1、常規用法。

①大括號拓展。(通配(globbing))將對大括號中的檔名做擴充套件。在大括號中,不允許有空白,除非這個空白被引用或轉義。第一種:對大括號中的以逗號分割的檔案列表進行拓展。如 touch .txt 結果為a.txt b.txt。第二種:對大括號中以點點(..)分割的順序檔案列表起拓展作用,如:touch .txt 結果為a.txt b.txt c.txt d.txt

②**塊,又被稱為內部組,這個結構事實上建立了乙個匿名函式 。與小括號中的命令不同,大括號內的命令不會新開乙個子shell執行,即指令碼餘下部分仍可使用括號內變數。括號內的命令間用分號隔開,最後乙個也必須有分號。{}的第乙個命令和左括號之間必須要有乙個空格。

2、特殊用法。

例如:$、$、$、$等單獨作為一篇記錄。

四)例子:

for i in $(seq 0 4);do echo $i;done

for i in `seq 0 4`;do echo $i;done

for ((i=0;i<5i++));do echo $i;done

for i in;do echo $i;done

看到上面的例子就知道了,各種括號,各種用法,乙個問題可以用幾種不同的方法解決,但是在節約**的同時,也要照顧到指令碼的可讀性,可移植性,盡量使用風險小的,可移植性好的,不要只圖省事,養成乙個良好的**風格。

原文出自:

shell中的括號

在編寫shell scripts時,經常會用到括號,各種括號,各種用法。一 括號 圓括號 1 單小括號。命令組。括號中的命令將會新開乙個子shell順序執行,所以括號中的變數不能夠被指令碼餘下的部分使用。括號中多個命令之間用分號隔開,最後乙個命令可以沒有分號,各命令和括號之間不必有空格。命令替換。等...

shell中的括號

假設我們定義了乙個變數為 file dir1 dir2 dir3 my.file.txt 拿掉第一條 及其左邊的字串 dir1 dir2 dir3 my.file.txt 拿掉最後一條 及其左邊的字串 my.file.txt 拿掉第乙個 及其左邊的字串 file.txt 拿掉最後乙個 及其左邊的字串...

shell中括號的用法

test 因為 shell 和我們通常程式語言不同,更多的情況是和它互動,總是呼叫別人。所以有些本屬於程式語言本身的概念在 shell 中會難以理解。基本功 不好,更容易 犯睏 了,我就是乙個 以 bash 為例 其他相容 shell 差不多 1.test 和 是 bash 的內部命令,gnu li...