1. 程式人生 > >(一)Shell的條件判斷符及特殊變數

(一)Shell的條件判斷符及特殊變數

目錄

1 shell的條件判斷

簡單條件判斷
條件測試通常有如下3中形式:

語法格式1:test<測試表達式>
語法格式2:[ <測試表達式> ]
語法格式3:[[ <測試表達式> ]]

說明:

  1. 上述語法格式1和語法格式2的寫法是等價的。語法格式3為擴充套件的test命令,這裡最好使用語法格式2。
  2. 在[[ ]]中可以使用萬用字元進行模式匹配。&&、||、>、<等操作符可以應用於[[ ]]中,但不能應用於[ ]中。
  3. 對於整數的關係運算,也可以使用Shell的算術運算子(())。
  4. 在寫中括號表示式的時候括號裡的兩端要有至少一個空格。
  5. 這樣的條件判斷語句要比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

測試結果結論:

  1. 整數加雙引號也是對的
  2. [[]]-eq等的寫法也是對的;[[]]>寫法也可能不對,它比較數值的第一位,邏輯結果不對。
  3. []>號的寫法語法沒錯,邏輯結果不對。
    工作:使用[]-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不相等(不相等返回真)

特別注意:

  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經常用於對判斷語句進行測試一種或幾種狀態的條件是否成立二. 判斷