詳解shell指令碼 n

2022-09-26 13:39:34 字數 2758 閱讀 6580

在寫指令碼的時候,總是搞不懂 的區別,這次寫乙個總結,把它掌握牢固

和test

兩者是一樣的,在命令列裡test expr和[ expr ]的效果相同。

test的三個基本作用是判斷檔案、判斷字串、判斷整數。支援使用 」與或非「 將表示式連線起來。

test中可用的比較運算子只有==和!=,兩者都是用於字串比較的,不可用於整數比較,整數比較只能使用-eq, -gt這種形式。

無論是字串比較還是整數比較都千萬不要使用大於號小於號。當然,如果你實在想用也是可以的,對於字串比較可以使用尖括號的轉義形式, 如果比較"ab"和"bc":[ ab \< bc ],結果為真,也就是返回狀態為0.

[[ ]]

這是內建在shell中的乙個命令,它就比剛才說的test強大的多了。支援字串的模式匹配(使用=~操作符時甚至支援shell的正則表達 式)。邏輯組合可以不使用test的-a,-o而使用&& ||。

字串比較時可以把右邊的作為乙個模式(這是右邊的字串不加雙引號的情況下。如果右邊的字串加了雙引號,則認為是乙個文字字串。),而不僅僅是乙個字串,比如[[ hello == hell? ]],結果為真。

注意:使用和的時候不要吝嗇空格,每一項兩邊都要有空格,[[ 1 == 2 ]]的結果為「假」,但[[ 1==2 ]]的結果為「真」!

1. 首先,儘管很相似,但是從概念上講,二者是不同層次的東西。

"[[",是關鍵字,許多shell(如ash bsh)並不支援這種方式。ksh, bash(據說從2.02起引入對[[的支援)等支援。

"["是一條命令, 與test等價,大多數shell都支援。在現代的大多數sh實現中,"["與"test"是內部(builtin)命令,換句話說執行"test"/"["時不會呼叫/some/path/to/test這樣的外部命令(如果有這樣的命令的話)。

2.結構比bash版本的更通用。在[[和]]之間的所有的字元都不會被檔案擴充套件或是標記分割,但是會有引數引用和命令替換。

用[[ ... ]]測試結構比用[ ... ]更能防止指令碼裡的許多邏輯錯誤。比如說,&&,||,和》操作符能在乙個測試裡通過,但在結構會發生錯誤。

3.(( ))結構擴充套件並計算乙個算術表示式的值。如果表示式值為0,會返回1或假作為退出狀態碼。乙個非零值的表示式返回乙個0或真作為退出狀態碼。這個結構和先前test命令及結構的討論剛好相反。

4.[ ... ]為shell命令,所以在其中的表示式應是它的命令列引數,所以串比較操作符">" 與""不需轉義;

由於"[["是關鍵字,不會做命令列擴充套件,因而相對的語法就稍嚴格些。例如

在[ 程式設計客棧... ]中可以用引號括起操作符,因為在做命令列擴充套件時會去掉這些引號,而在[[ ... ]]則不允許這樣做。

5.[[ ... ]]進行算術擴充套件,而[ ... ]不做

6.[[ ... && ... && ... ]] 和 uppzf[ ... -a ... -a ...] 不一樣,[[ ]] 是邏輯短路操作,而 [ ] 不會進行邏輯短路

應用場景分析:

1、在中括號中,判斷變數的值, 加不加雙引號的問題?

-z 判斷 變數的值,是否為空; zero = 0

- 變數的值,為空,返回0,為true

- 變數的值,非空,返回1,為false

-n 判斷變數的值,是否為空   name = 名字

- 變數的值,為空,返回1,為false

- 變數的值,非空,返回0,為true

pid="123"

[ -z "$pid" ]&nbs 單對中括號變數必須要加雙引號

[[ -z $pid ]]   雙對括號,變數不用加雙引號

[ -n "$pid" ]  單對中括號,變數必須要加雙引號

[[ -z  $pid ]]  雙對中括號,變數不用加雙引號

2、多個條件判斷, 和 的區別?

2.1:[[ ]] 雙對中括號,是不能使用 -a 或者 -o的引數進行比較的;

&& 並且 || 或 -a 並且 -o 或者

[[ ]] 條件判斷 && 並且 || 或

[[ 5 -lt 3 || 3 -gt 6 ]] 乙個條件,滿足,就成立 或者的關係

[[ 5 -lt 3 || 3 -gt 6 ]] 乙個條件滿足www.cppcns.com,就成立 或者的關係

[[ 5 -lt 3 ]] || [[3 -gt 6 ]]

[[ 5 -lt 3 ]] || [[3 -gt 6 ]] 寫在外面也可以

&& 必須兩個條件同時滿足,和上述一樣,這裡想說明的問題的是:

[[ 5 -lt 3]] -o [[ 3 -gt 6 ]] [[ 5 -lt 3 -o 3 -gt 6 ]]

[[ 5 -lt 3 -a 3 -gt 6 ]] [[ 5 -lt 3 -a 3 -gt 6 ]]

-a 和 -o就不成立了,是因為, 雙對中括號,不能使用 -o和 -a的引數

直接報錯:

2.2 [ ] 可以使用 -a -o的引數,但是必須在 [ ] 中括號內,判斷條件,例如:

[ 5 -lt 3 -o 3 -gt 2 ] 或者條件成立

[5 -lt 3 ] -o [ 3 -gt 2] 或者條件, 這個不成立,因為必須在中括號內判斷

如果想在中括號外判斷兩個條件,必須用&& 和 || 比較

[5 -lt 3 ] || [ 3 -gt 2]

[5 -gt 3 ] &&am程式設計客棧p; [ 3 -gt 2] 成立

相對的,|| 和 && 不能在中括號內使用,只能在中括號外使用

3、當判斷某個變數的值是否滿足正規表示式的時候,必須使用[[ ]] 雙對中括號

單對中括號,直接報錯:

Shell指令碼函式詳解

二 呼叫函式的方法 三 函式作用的範圍 1.將命令序列按格式寫在一起 2.可方便重複使用命令數列 function 函式名 for a in 遍歷使用者給定的位置引數 docheckpid a 呼叫checkpid函式,檢查對應的程序是否在執行 if eq 0 then 根據函式的返回值做判斷 ec...

shell指令碼基本語法詳解

1 編寫shell指令碼的時候,前面必須加上 bin bash 2 一般shell的變數賦值的時候不用帶 而使用或者輸出的時候要帶 3 加減乘除的時候要加兩層小括號,括號外面要有乙個 4 變數賦值,變數使用的時候不能有空格,否則會被解析成命令,報錯無此命令。執行shell指令碼的兩種 方式 1 sh...

shell指令碼併發控制詳解

file descriptors fd,檔案描述符或檔案控制代碼 程序使用檔案描述符來管理開啟的檔案 檢視當前程序的fd 確定以下三點 如何exec開啟乙個檔案 exec 3 file1.txt 如何exec關閉乙個檔案 釋放檔案控制代碼 如果沒有釋放控制代碼,檔案刪除後描述符依然還在 exec 3...