(一)Shell的條件判斷符及特殊變數
目錄
1 shell的條件判斷
簡單條件判斷
條件測試通常有如下3中形式:
語法格式1:test<測試表達式>
語法格式2:[ <測試表達式> ]
語法格式3:[[ <測試表達式> ]]
說明:
- 上述語法格式1和語法格式2的寫法是等價的。語法格式3為擴充套件的test命令,這裡最好使用語法格式2。
- 在[[ ]]中可以使用萬用字元進行模式匹配。&&、||、>、<等操作符可以應用於[[ ]]中,但不能應用於[ ]中。
- 對於整數的關係運算,也可以使用Shell的算術運算子(())。
- 在寫中括號表示式的時候括號裡的兩端要有至少一個空格。
- 這樣的條件判斷語句要比if語句更簡潔,但是沒有if語句更容易理解。
例子:
# 簡單與或運算
[[email protected] ~]# [ -e /etc/hosts ] && echo 0 || echo 1
0
[[email protected] ~]# [ -e /etc/host ] && echo 0 || echo 1
1
# 這裡注意 -e 引數是判斷檔案是否存在,Linux中一切皆檔案
[[email protected] ~]# [ -e /etc/ ] && echo 0
0
[[email protected] ~]# [ -f /etc/ ] && echo 0 || echo 1
1
[[email protected] ~]# [ -d /etc/ ] && echo 0 || echo 1
0
# 可在大括號中包含多個命令
[[email protected] scripts]# cat test1.sh
#!/bin/bash
[ $1 -eq 8 ] && {
echo 1
echo 1
echo 1
}
[[email protected] scripts]# bash test1.sh 8
1
1
1
[[email protected] scripts]# bash test1.sh 9
[[email protected] scripts]#
1.1 按照檔案型別進行判斷
選項 | 作用 |
---|---|
-b 檔案 | 判斷該檔案是否存在,並且是否為塊裝置檔案(是的為真) |
-c 檔案 | 判斷該檔案是否存在,並且是否為字元裝置檔案(是的話為真) |
-d 檔案 | 判斷該檔案是否存在,並且是否為目錄檔案(是的話為真) |
-e 檔案 | 判斷該檔案是否存在(存在的話為真) |
-f 檔案 | 判斷該檔案是否存在,並且是否為普通檔案(是的話為真) |
-L 檔案 | 判斷該檔案是否存在,並且是否為符號連結檔案(是的話為真) |
-p 檔案 | 判斷該檔案是否存在,並且是否為管道檔案(是的話為真) |
-s 檔案 | 判斷該檔案是否存在,並且是否為非空(是的話為真) |
-S 檔案 | 判斷該檔案是否存在,並且是否為套接字檔案(是的話為真) |
1.2 按照檔案許可權進行判斷
選項 | 作用 |
---|---|
-r 檔案 | 判斷該檔案是否存在,並且是否該檔案擁有讀許可權(有為真) |
-w 檔案 | 判斷該檔案是否存在,並且是否該檔案擁有寫許可權(有為真) |
-x 檔案 | 判斷該檔案是否存在,並且是否該檔案擁有執行許可權(有為真) |
-u 檔案 | 判斷該檔案是否存在,並且是否該檔案擁有SUID許可權(有為真) |
-g 檔案 | 判斷該檔案是否存在,並且是否該檔案擁有SGID(有為真) |
-k 檔案 | 判斷該檔案是否存在,並且是否該檔案擁有Sbit(有為真) |
1.3 兩個檔案之間進行比較
選項 | 作用 |
---|---|
檔案1 -nt 檔案2 | 判斷檔案1的修改時間是否比檔案2的新(若是則為真) |
檔案1 -ot 檔案2 | 判斷檔案1的修改時間是否比檔案2的舊(若是則為真) |
檔案1 -ef 檔案2 | 判斷檔案1是否和檔案2的inode號一致,可以理解為兩個檔案是否為同一個檔案,這個判斷用於判斷硬連結是很好的方法 |
1.4 兩個整數之間比較
選項 | 作用 |
---|---|
整數1 -eq 整數2 | 判斷整數1是否和整數2相等(相等為真) |
整數1 -ne 整數2 | 判斷整數1是否和整數2不相等(不相等為真) |
整數1 -gt 整數2 | 判斷整數1是否大於整數2(大於為真) |
整數1 -lt 整數2 | 判斷整數1是否小於整數2(小於為真) |
整數1 -ge 整數2 | 判斷整數1是否大於等於整數2(大於等於為真) |
整數1 -le 整數2 | 判斷整數1是否小於等於整數2(小於等於為真) |
eq
==> equal
ne
==> not equal
gt
==> greater than
lt
==> less than
ge
==> greater than or equal
le
==> less than or equal
測試:
[[email protected] scripts]# [[ 3 -eq 2 ]]
[[email protected] scripts]# echo $?
1
[[email protected] scripts]# [[ 3 -eq 3 ]]
[[email protected] scripts]# echo $?
0
[[email protected] scripts]# [[ 3 = 3 ]]
[[email protected] scripts]# echo $?
0
# 測試[[]]的大於符號,可以明顯看出區別,只會順位比較第一字元
[[email protected] scripts]# [[ 3 > 2 ]]
[[email protected] scripts]# echo $?
0
[[email protected] scripts]# [[ 3 > 22 ]]
[[email protected] scripts]# echo $?
0
[[email protected] scripts]# [[ 3 > 111 ]]
[[email protected] scripts]# echo $?
0
[[email protected] scripts]# ((3>111))
[[email protected] scripts]# echo $?
1
[[email protected] scripts]# ((3<111))
[[email protected] scripts]# echo $?
0
測試結果結論:
- 整數加雙引號也是對的
[[]]
用-eq
等的寫法也是對的;[[]]
用>
寫法也可能不對,它比較數值的第一位,邏輯結果不對。[]
用>
號的寫法語法沒錯,邏輯結果不對。
工作:使用[]
的-eq
用法。
小結:
# 整數比較推薦下邊用法:
[ $num -eq $num2 ] #注意空格,和比較符號
(($num1>$num2)) #無需空格,常規數學比較符號
# 系統指令碼例子
[[email protected] ~]# grep -w "\-eq" /etc/init.d/nfs
[ $RETVAL -eq 0 ] && RETVAL=$rval
[ $RETVAL -eq 0 ] && RETVAL=$rval
[ $RETVAL -eq 0 ] && RETVAL=$rval
[ $RETVAL -eq 0 ] && RETVAL=$rval
[ $RETVAL -eq 0 ] && RETVAL=$rval
1.5 字串的判斷
選項 | 作用 |
---|---|
-z “字串” | 判斷字串是否為空(為空返回真) |
-n “字串” | 判斷字串是否為非空(非空返回真) |
“字串1” == “字串2” | 判斷字串1是否和字串2相等(相等返回真) |
“字串1” != “字串2” | 判斷字串1是否和字串2不相等(不相等返回真) |
特別注意:
- 以上表格中的字串測試操作符務必要用
""
引起來。 - 比較符號的兩端必須有空格。
例子:
[root@linux-node1 ~]# [ -n "abc" ] && echo 0 || echo 1
0
[root@linux-node1 ~]# [ -z "abc" ] && echo 0 || echo 1
1
[root@linux-node1 ~]# [ ! -z "abc" ] && echo 0 || echo 1
0
# 系統指令碼用法
[root@linux-node1 ~]# sed -n '30,31p' /etc/init.d/network
# Check that networking is up.
[ "${NETWORKING}" = "no" ] && exit 6
# 擷取部分nfs啟動指令碼檔案
[root@linux-node1 ~]# vim /etc/init.d/nfs
[ -z "$MOUNTD_NFS_V2" ] && MOUNTD_NFS_V2=default
[ -z "$MOUNTD_NFS_V3" ] && MOUNTD_NFS_V3=default
# Number of servers to be started by default
[ -z "$RPCNFSDCOUNT" ] && RPCNFSDCOUNT=8
1.6 多重條件判斷
選項 | 作用 |
---|---|
判斷1 -a 判斷2 | 邏輯與,判斷1和判斷2都成立,最終的結果才為真 |
判斷1 -o 判斷2 | 邏輯或,判斷1和判斷2有一個成立,最終的結果就為真 |
! 判斷 | 邏輯非,是原始的判斷是取反 |
提示:
! 中文意思是反:與一個邏輯值相反的邏輯值
-a 中文意思是與(and &&):兩個邏輯值都為“真”,返回值才為“真”,反之為“假”
-o 中文意思是或(or ||):兩個邏輯值之遙有一個為“真”,返回值就為“真”
邏輯操作符運算規則:
結論:-a和&&的運算規則:只有兩端都是1才為真
真true 1
假false 0
例子:
[[email protected] ~]# f1=/etc/rc.local;f2=/etc/services
# 在[]單中括號中不能使用&&
[[email protected] ~]# [ -f "$f1" && -f "$f2" ] && echo 1||echo 2
-bash: [: missing `]'
2
[[email protected] ~]# [ -f "$f1" -a -f "$f2" ] && echo 1||echo 2
1
[[email protected] ~]# a=1
[[email protected] ~]# b=2
[[email protected] ~]# [ $a -eq 2 -a $b -eq 2 ] && echo 1||echo 0
0
[[email protected] ~]# [ $a -eq 1 -a $b -eq 2 ] && echo 1||echo 0
1
[[email protected] ~]# [ $a -eq 1 -o $b -eq 2 ] && echo 1||echo 0
1
[[email protected] ~]# [ $a -eq 3 -o $b -eq 3 ] && echo 1||echo 0
0
# 系統指令碼:
[[email protected] ~]# sed -n '87,90p' /etc/init.d/nfs
[ "$NFSD_MODULE" != "noload" -a -x /sbin/modprobe ] && {
/sbin/modprobe nfsd
[ -n "$RDMA_PORT" ] && /sbin/modprobe svcrdma
}
小結:
[]
中用-a、-o、![[]]
中用&&、||、!- test用法和[]相同
- 多個[]之間以及多個[[]]之間,或者任意混合中間邏輯操作符都是&&或||
2 shell的特殊變數
$0
當前指令碼的名字,如果包含路徑則會一併輸出
$n
傳遞給指令碼或函式的引數,第n個引數值,n=1..9,若n大於就則需用{}括起來,如:${10}
$*
傳遞給指令碼或函式的引數個數。此選項引數可超過9個。
$#
傳遞給指令碼或函式的所有引數。
$$
當前Shell程序ID(指令碼執行的當前程序ID號)
$!
執行上一個指令的PID(後臺執行的最後一個程序的程序ID號)
$?
執行上一個指令的返回值 (顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤)
$-
顯示shell使用的當前選項,與set命令功能相同
$_
在此之前執行的命令或指令碼的最後一個引數
[email protected]
跟$*
類似,但是可以當作陣列用
相關推薦
(一)Shell的條件判斷符及特殊變數
目錄 1 shell的條件判斷 簡單條件判斷 條件測試通常有如下3中形式: 語法格式1:test<測試表達式> 語法格式2:[ <測試表達式> ] 語法格式3:
Java基礎語法學習8——條件運算符及運算符優先級
str ima http 運算符 技術分享 語法 運算 style com 1.條件運算符 Java基礎語法學習8——條件運算符及運算符優先級
shell 條件判斷
may 字符串相同 use after 文件的 suid last 描述 non-zero 1.字符串判斷 str1 = str2 當兩個串有相同內容、長度時為真 str1 != str2 當串str1和str2不等時為真 -n str1
[Shell]條件判斷與流程控制:if, case, for, while, until
設備 重啟 硬鏈接 HA rpm 套接字 字符串 regular 符號 【條件判斷】 1. 按文件類型進行判斷 -b 文件 判斷該文件是否存在,並且為塊設備文件(是塊設備文件為真) -c 文件 判斷該文件是否存在,並且為字符設備文件(是字符設
馬哥學習--李洋個人筆記之條件判斷test及文件查找find
test find pstree -p 查看當前終端的進程樹. test命令 長格式的例子:test "$A" == "$B" && echo "Strings are equal"test “$A” -eq “$B” &a
Shell條件判斷語句與if
相等 完全 ash find sts elif 用戶輸入 判斷語句 數字 一、條件判斷語句 滿足條件執行對應命令 [ 條件 ]:一般多用於腳本內 例: [ -f /etc/hosts ] test 條件:一般多用於Linux字符終端 1.文件或目錄判斷 -f:判斷是否為文件
shell條件判斷if中的-a到-z的意思
res 設備 ring1 描述 bin 數字 sed per === [ -a FILE ] 如果 FILE 存在則為真。 [ -b FILE ] 如果 FILE 存在且是一個塊特殊文件則為真。 [ -c FILE ] 如果 FILE 存在且是一個字特殊文件則為真
shell條件判斷表示式
IF條件判斷 1、基本語法: if [ command ]; then 符合該條件執行的語句 fi 2、擴充套件語法: if [ command ];then 符合該條件執行的語句 elif [ command ];then 符合該條件執行的語句 else 符合該條件執行的語句 fi 3、語法說明:
linux shell 條件判斷if else, if elif else....
在linux的shell中 if 語句通過關係運算符判斷表示式的真假來決定執行哪個分支。Shell 有三種 if ... else 語句: if ... fi 語句; if ... else ... fi 語句; if ... elif ... e
關於sql中的if條件判斷符 並且和或的表達
今天寫sql語句,然後碰到要同時判斷兩個條件的if語句,瞬間想起c#中肯定是if(id>0&&id<40)和 if(id>0||id<40)等的判斷但是sql中這樣寫很顯然會報錯,經過查詢才知道sql中的寫法是if @id>0 a
shell條件判斷二 (if、case)
單分支if 格式 (1)if [];then fi (2)if [] then fi 應用:(1)判斷使用者是誰(2)判斷分割槽使用率 雙分
shell條件判斷
IF條件判斷 1、基本語法: if [ command ]; then 符合該條件執行的語句 fi 2、擴充套件語法: if [ command ];then 符合該條件執行的語句 elif [ command ];then 符合該條件執行的語句 else 符合該條件執行的語句 fi 3、語法說明:
shell的位置引數和特殊變數
shell中有很多自動複製的變數 常用的位置引數和特殊變數有 $0 相當於C語言main函式的argv[0] $1 $2 $3....位置引數,相當於argv[1],argv[2],argv[3] $# 相當於argv -1 [email&
shell條件判斷 if else
符號鏈接 轉義符 正則表達 問題 字符設備 時也 算術 new 語句 基本語法 shell的if語法和C語言等高級語言非常相似,唯一需要註意的地方就是shell的if語句對空格方面的要求比較嚴格(其實shell對所有語法的空格使用都比較嚴格),如果在需要空格的地方沒有打上空
linux--shell編程(三)條件判斷及算術運算
寫一個腳本 head bsp 如何 cut inittab 引用 有用 color 練習:寫一個腳本判斷當前系統上是否有用戶的默認shell為bash; 如果有,就顯示有多少個這類用戶;否則,就顯示沒有這類用戶; #!/bin/bash # grep ‘\<ba
Shell指令碼(介紹,變數,運算,條件判斷,迴圈,函式)
shell是人機互動的翻譯 注意的是,shell和Linux核心合在一起才是Linux。 Shell指令碼命令由兩種工作方式, 一種是互動式,寫一句命令,執行一句命令 一種是批處理,一次執行多個命令,先把命令寫好,然後在執行 舉個例子: [[emai
shell常用判斷條件和變數
下面列舉的判斷條件或者變數可能在寫shell指令碼時經常會用到。 指令碼除錯-n: 讀一遍指令碼中的命令但不執行,用於檢查指令碼中的語法錯誤 -v: 一邊執行指令碼,一邊將執行過的指令碼命令列印到標準錯誤輸出 -x: 提供跟蹤執行資訊,將執行的每一條命令和結果依次打印出來
shell指令碼及makefile中的特殊變數
shell指令碼中的特殊變數 1. $# 傳遞到指令碼的引數個數 2. $* 以一個單字串顯示所有向指令碼傳遞的引數。與位置變數不同,此選項引數可超過9個3. $$ 指令碼執行的當前程序ID號4. $! 後臺執行的最後一個程序的程序ID號5. [email p
shell 編程 -- 條件判斷
如果 -s size 裏的 字符串 ron -o 普通 修改 1.按照文件類型進行判斷(常用的)-b 判斷該文件是否存在-d 判斷是否存在,並且是否為目錄(是目錄就為真)-e 判斷該文件是否存在(存在為真)-f 判斷文件是否存在,並且是否為普通文件(是普通文件為真)-L 判
Shell中條件判斷語法與判斷條件
expression 表達式 字符串 linux 影響 一,簡介Shell各種判斷結構和運算符的用法是shell編程的基礎,了解shell的判斷、運算符和一些退出狀態對後面的學習有很重要的影響。shell有一個內部命令test經常用於對判斷語句進行測試一種或幾種狀態的條件是否成立二. 判斷