天天看點

Linux之Bash基礎特性條件測試&&自定義退出狀态碼(6)

條件測試

    判斷某需求是否滿足,需要由測試機制來實作。

    根據指令的執行狀态結果,表達不同的測試條件

1、根據id指令的執行狀态結果,判斷使用者是否存在

1

2

3

4

5

6

7

8

9

<code>[root@izpo45bh60h6bsz ~]</code><code># id root</code>

<code>uid=0(root) gid=0(root) </code><code>groups</code><code>=0(root)</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># echo $?</code>

<code>0</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># id help</code>

<code>id</code><code>: help: no such user</code>

<code>1</code>

2、根據在/etc/passwd檔案中找到root開頭的詞的執行狀态結果,判斷使用者是否存在

<code>[root@izpo45bh60h6bsz ~]</code><code># grep -q '^root\b' /etc/passwd</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># grep -q '^help\b' /etc/passwd</code>

使用測試,在測試時,要使用特殊的測試符

    1)test 測試表達式

<code>[root@izpo45bh60h6bsz ~]</code><code># test 1 &gt; 3</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># test 1 -gt 3 # 在數值測試時,用-gt表示 &gt; 符号</code>

    2)[ 測試表達式 ]

<code>[root@izpo45bh60h6bsz ~]</code><code># [1 -lt 3]   # 測試表達示與中括号必須存在空格,否則就會報錯。</code>

<code>-</code><code>bash</code><code>: [1: </code><code>command</code> <code>not found</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># [ 1 -lt 3 ]  # 在數值測試時,用-lt表示 &lt; 符号</code>

  3) [[  測試表達式 ]]

<code>[root@izpo45bh60h6bsz ~]</code><code># [[1 -lt 3]]</code>

<code>-</code><code>bash</code><code>: [[1: </code><code>command</code> <code>not found</code>

<code>[root@izpo45bh60h6bsz ~]</code><code># [[ 1 -eq 3 ]]  # 在數值測試時,用-eq 表示 = 符号</code>

測試符分類

    數值測試

        -eq 左側是否等于右側

        -ne 是不等于

        -gt 是否大于

        -ge 是否大于等于

        -lt 是否小于

        -le 是否小于等于

1)A  -eq  B,  測試A所表示的數值是否等于B所表示的數值。等于為真

10

11

12

13

14

15

16

<code>##測試方法一</code>

<code># A=1</code>

<code># B=10</code>

<code># test $B -eq $A  # 測試變量B記憶體空間中存儲的資料和變量A記憶體空間中存儲的資料是否相等</code>

<code># echo $?</code>

<code>##測試方法二</code>

<code># [ $B -eq $A ]</code>

<code>##測試方法三</code>

<code># [[ $B -eq $A ]]</code>

2)A  -ne  B,  測試A所表示的數值是否不等于B所表示的數值。不等于為真

<code># test $B -ne $A  # 測試變量B記憶體空間中存儲的資料和變量A記憶體空間中存儲的資料是否不相等</code>

<code># [ $B -ne $A ]</code>

<code># [[ $B -ne $A ]]</code>

3) A  -gt  B , 測試A所表示的數值是否大于B所表示的數值。大于為真

<code># test 10 -gt 3 # 測試10是否大于3</code>

<code># [ 10 -gt 3 ]</code>

<code># [[ 10 -gt 3 ]]</code>

3) A  -ge  B , 測試A所表示的數值是否大于等于B所表示的數值。大于等于為真

<code># test 10 -ge 3 # 測試10是否大于等于3</code>

<code># [ 10 -ge 3 ]</code>

<code># [[ 10 -ge 3 ]]</code>

4)A -lt B , 測試A所表示的數值是否小于B所表示的數值。小于為真

<code># let 1 -lt 3    # 測試 1 是否小于 3</code>

<code># [ 1 -lt 3 ]</code>

<code># [[ 1 -lt 3 ]]</code>

5)A -le B , 測試A所表示的數值是否小于等于B所表示的數值。小于等于為真

<code># let 1 -le 3    # 測試 1 是否小于 3</code>

<code># [ 1 -le 3 ]</code>

<code># [[ 1 -le 3 ]]</code>

    字元測試 (所有的操作數,都應該使用引用)

== 等值測試

&gt;  是否大于, ASCII碼的比較

&lt;  是否小于

!= 是否不等于

A =~ PATTERN 左側字元串是否能夠被右側的(正規表達式)PATTERN所比對到。一般用于 ` ` 中,PATTERN不能加引号

-z "STRING" 測試字串是否為空,空為真

-n "STRING" 是否不空

1) A == B ,A所表示的字元和B所表示的字元是否相等

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

<code># test "obama" == "obama"  # 測試左側字元串,是否與右側字元串相等</code>

<code># test "obama" == "Obama"   # 可見字元串,必須完成相等</code>

<code># A=obama</code>

<code># B=jerry</code>

<code># test "$A" == "$B"     # 測試A變量記憶體空間存儲的資料(字元型或數值型)是否與B變量中存儲的資料相等</code>

<code># [ "obama" == "obama" ]</code>

<code># [ "$A" == "$B" ]</code>

<code># [[ "obama" == "obama" ]]</code>

<code># [[ "$A" == "$B" ]]</code>

2) A &gt; B ,A所表示的字元是否大于B所表示的字元

3) A &lt; B ,A所表示的字元是否小于B所表示的字元

4) A != B ,A所表示的字元和B所表示的字元是否不相等

<code># test </code><code>"obama"</code> <code>!= </code><code>"obama"</code>  <code># 測試左側字元串,是否與右側字元串不相等</code>

<code># test </code><code>"$B"</code> <code>!= </code><code>"$A"</code> 

<code># [ </code><code>"obama"</code> <code>!= </code><code>"obama"</code> <code>] </code>

<code># [ </code><code>"$B"</code> <code>!= </code><code>"$A"</code> <code>] </code>

<code># [[ </code><code>"obama"</code> <code>!= </code><code>"obama"</code> <code>]]</code>

<code># [[ </code><code>"$A"</code> <code>!= </code><code>"$B"</code> <code>]]</code>

5) A =~ B ,A所表示的字元能否被B所表示的(正規表達式)模式所比對。

<code># test "obama" =~ "^o.*"</code>

<code>-</code><code>bash</code><code>: </code><code>test</code><code>: =~: binary operator expected</code>

<code># test "obama" =~ ^o.*</code>

<code># [ "obama" =~ "^o.*" ]</code>

<code>-</code><code>bash</code><code>: [: =~: binary operator expected</code>

<code># [ "obama" =~ ^o.* ]</code>

<code># [[ "obama" =~ "^o.*" ]]</code>

<code># [[ "obama" =~ ^o.* ]] #模式不能加引号</code>

6)-z  "B",  測試B所表示的字元串是否為空,空為真

<code># test -z "obama"</code>

<code>A=</code>

<code># test -z "$A"  # A變量為空時,測試其結果</code>

<code>A=jerry</code>

<code># test -z "$A"  # A變量不空時,測試其結果</code>

<code># [ -z "how are you?" ]</code>

<code># [ -z "$A" ]</code>

<code># [[ -z "how are you?" ]] # 測試字串是否為空</code>

<code># [[ -z "$A" ]]  # 測試變量中存儲的字串,是否為空</code>

7) -n "B",  測試B所表示的字元串是否為不空,不空為真

<code># test -n "obama"</code>

<code># test -n "$A"  # A變量為空時,測試其結果</code>

<code># test -n "$A"  # A變量不空時,測試其結果</code>

<code># [ -n "how are you?" ]</code>

<code># [ -n "$A" ]</code>

<code># [[ -n "how are you?" ]] # 測試字串是否為空</code>

<code># [[ -n "$A" ]]  # 測試變量中存儲的字串,是否為空</code>

    檔案測試

-a 或 -e 測試檔案是否存在,存在時狀态傳回值為0,否則為1-255

<code># [ -a /tmp/file.txt ] # 測試檔案是否存在,存在執行狀态結果為0,否則為1-255</code>

<code># [ -e /tmp/file.txt ] # 測試檔案是否存在,存在執行狀态結果為0,否則為1-255</code>

存在且檔案為什麼類别 (dbc lsp)

-b 是否存在且為 塊裝置檔案,存在則為真

<code># [ -b /dev/sda ]  #不存在或不為塊裝置,結果為1.-255</code>

<code># [ -b /dev/vda ]  #存在且為塊裝置,結果為0</code>

<code># ls -l /dev/sda   #驗證結果,不存在</code>

<code>ls</code><code>: cannot access </code><code>/dev/sda</code><code>: No such </code><code>file</code> <code>or directory</code>

<code># ls -l /dev/vda   #驗證結果,存在</code>

<code>brw-rw---- 1 root disk 253, 0 Jul 31  2017 </code><code>/dev/vda</code>   <code>##由b可知為塊裝置</code>

-c 是否存在 且為字元裝置檔案

<code>crw-rw-rw- 1 root root      1,   5 Jul 31  2017 zero</code>

<code>crw-rw-rw- 1 root root      1,   3 Jul 31  2017 null</code>

<code># [ -c /dev/null ] #存在且為字元裝置</code>

<code># [ -c /dev/zero ]</code>

-d 是否存在 且為目錄 檔案

<code># ls -ld /etc</code>

<code>drwxr-xr-x. 111 root root 12288 Jun 11 16:38 </code><code>/etc</code>

<code># [ -d /etc ]</code>

-f 是否存在 且為普通 檔案

<code># ls -l /var/log/yum.log</code>

<code>-rw------- 1 root root 0 Jun 10 12:26 </code><code>/var/log/yum</code><code>.log</code>

<code># [ -f /var/log/yum.log ]</code>

-p 管道

<code># [ -p /var/log/yum.log ]</code>

-h 或 -L 符号連結

<code># ls -l /etc/system-release</code>

<code>lrwxrwxrwx 1 root root 14 Jul 31  2017 </code><code>/etc/system-release</code> <code>-&gt; centos-release</code>

<code># [ -h /etc/system-release ]</code>

<code># [ -L /etc/system-release ]</code>

-S 套接字

<code># ls -l /dev/log</code>

<code>srw-rw-rw- 1 root root 0 Jul 31  2017 </code><code>/dev/log</code>

<code># [ -S /dev/log ]</code>

存在且有特殊權限:(檔案本身)

-g ,擁有sgid權限 

<code># ls -l /etc/passwd</code>

<code>-rw-r--r-- 1 root root 3673 Jun 10 13:22 </code><code>/etc/passwd</code>

<code># [ -g /etc/passwd ]</code>

-u ,擁有suid權限

<code># [ -u /etc/passwd ]</code>

-k , 擁有sticky權限

<code># [ -k /tmp ]</code>

<code># ls -ld /tmp</code>

<code>drwxrwxrwt. 13 root root 4096 Jun 12 00:11 </code><code>/tmp</code>

檔案權限: (跟使用者相關) 

-r 檔案存在且可讀 cat

<code># ls -l /etc/shadow a.txt</code>

<code>-rw-r--r-- 1 root root  127 Jun 11 19:25 a.txt</code>

<code>---------- 1 root root 2843 Jun 10 13:24 </code><code>/etc/shadow</code>

<code># [ -r a.txt ]</code>

<code># [ -r /etc/shadow ]  ##root使用者能讀</code>

<code># su - myuser</code>

<code>Last login: Tue Aug  1 18:49:22 CST 2017 on pts</code><code>/0</code>

<code>$ [ -r </code><code>/etc/shadow</code> <code>]  </code><code>##對于普通使用者不能讀</code>

<code>$ </code><code>echo</code> <code>$?</code>

-w 檔案存在且可寫 修改

<code># [ -w /etc/shadow ]</code>

<code># [ -w a.txt ]</code>

-x 檔案存在且可執行 對于目前使用者

<code># ls -l /bin/ls</code>

<code>-rwxr-xr-x 1 root root 117656 Nov  6  2016 </code><code>/bin/ls</code>

<code># [ -x /bin/ls ]</code>

-s FILE 檔案存在且非空

<code># touch b.txt </code>

<code># cat b.txt </code>

<code># [ -s b.txt ]</code>

-t fd 檔案描述符 fd是否打開,且與某個終端相關

運作指令

1、終端無關: 與随系統啟動

2、終端相關: 手動運作,在互動式接口運作的指令。linux任何一個檔案被打開都有一個檔案描述符追蹤檔案

-N FILE 檔案從上次打開後 是否被修改過? (重定向)

<code># [ -N a.txt ]</code>

<code># echo "abc" &gt;&gt; a.txt</code>

-O FILE 目前有效使用者是否為檔案的屬主

<code># ls -l a.txt</code>

<code>-rw-r--r-- 1 root root 131 Jun 12 00:37 a.txt</code>

<code># [ -O a.txt ]</code>

-G FILE 目前有效使用者是否為檔案的屬組

<code># [ -G a.txt ]</code>

FILE1 -ef FILE2  refer to 指向    指向同一個裝置上的相同inode

    FILE1和FILE2是否為互為硬連結

<code># [ a.txt -ef b.txt ]</code>

<code># ln a.txt a.hl   ##建立硬連結</code>

<code># ls -li a.txt a.hl</code>

<code>1558766 -rw-r--r-- 2 root root 131 Jun 12 00:37 a.hl   </code><code>#inode 1558766</code>

<code>1558766 -rw-r--r-- 2 root root 131 Jun 12 00:37 a.txt  </code><code>#inode 1558766</code>

<code># [ a.txt -ef a.hl ]</code>

FILE1 -nt FILE2   new than  最近一次修改的時間戳FILE1較FILE2更靠近現在

<code># ls -l /tmp/ntp.conf*</code>

<code>-rw-r--r-- 1 root root 2439 Jun 11 20:46 </code><code>/tmp/ntp</code><code>.conf</code>

<code>-rw-r--r-- 1 root root 2439 Jun 12 00:47 </code><code>/tmp/ntp</code><code>.conf.bak</code>

<code># [ /tmp/ntp.conf -nt /tmp/ntp.conf.bak ]</code>

<code># echo $? ###說明/tmp/ntp.conf.bak更新</code>

FILE1 -ot FILE2   old than    最近一次修改的時間戳FILE1較FILE2更遠離現在

<code># [ /tmp/ntp.conf -ot /tmp/ntp.conf.bak ]</code>

<code># echo $?  ###說明/tmp/ntp.conf  更舊</code>

組合測試條件

    邏輯運算:

        連接配接指令

            COMMAND1 &amp;&amp; COMMAND2

            COMMAND1 || COMMAND2

            ! COMMAND

        連接配接條件

            [ EXPRESSION ] &amp;&amp; [ EXPRESSION ] 相當于 [ EXPRESSION -a EXPRESSION ]

            [ EXPRESSION ]   ||   [ EXPRESSION ] 相當于 [ EXPRESSION -o EXPRESSION ]

            [ ! EXPRESSION ]

摩根定律

    非(P 且 Q) = (非 P) 或 (非 Q)

    非(P 或 Q) = (非 P) 且 (非 Q)

    例如:

    [ ! EXPRESSION ] &amp;&amp;  [ ! EXPRESSION ] 相當于 [   !   \(   EXPRESSION -o EXPRESSION  \)  ]

<code>$ </code><code>install</code> <code>-m 000 </code><code>/etc/issue</code> <code>/tmp</code>

<code>$ </code><code>ls</code> <code>-l </code><code>/tmp/issue</code> 

<code>---------- 1 myuser myuser 23 Jun 12 05:32 </code><code>/tmp/issue</code>

<code>$ [ ! -r </code><code>/tmp/issue</code> <code>] &amp;&amp; [ ! -w </code><code>/tmp/issue</code> <code>]</code>

<code>$ [ ! \( -r </code><code>/tmp/issue</code> <code>-o -w </code><code>/tmp/issue</code> <code>\) ]</code>

<code>$ [ ! \(-r </code><code>/tmp/issue</code> <code>-o -w </code><code>/tmp/issue</code><code>\) ]</code>

<code>-</code><code>bash</code><code>: [: too many arguments</code>

2、bash中自定義退出狀态碼

    exit [#]  在bash腳本中,一旦遇到exit指令就會終止腳本,退出狀态碼為exit後的數值。

1、exit存在時

<code># nano helo.sh</code>

<code>#!/bin/bash</code>

<code>printf</code> <code>"hello everyone\n"</code> 

<code>exit</code> <code>1</code>

<code>## 判斷腳本執行的狀态結果</code>

<code># bash helo.sh </code>

<code>hello everyone</code>

2、exit不存在時

<code># bash helo.sh</code>

<code>ls</code> <code>/varr</code>

<code># echo $?   ##傳回值為最後一個指令的執行狀态結果</code>

<code></code>

本文轉自 lccnx 51CTO部落格,原文連結:http://blog.51cto.com/sonlich/1953085,如需轉載請自行聯系原作者

繼續閱讀