條件判斷工具 test or [ ]

概述

        條件判斷是學習shell腳本之前要掌握的重點基礎。條件判斷分為以下幾類:文件判斷、數值判斷、字符判斷。而文件判斷還可以細分到:文件類型判斷、文件權限判斷、文件所屬判斷、文件之間屬性判斷;

        舉個例子,如果我們要判斷/tmp下是否存在facker這個目錄或文件,可以結合&&和||命令來獲取到結果:

[facker@facker6 tmp]$ test -e facker && echo "file exit." || echo "file not found."
 file not found.
[facker@facker6 tmp]$ ls
 fstab functions grub.conf
[facker@facker6 tmp]$

      從結果中回顯可以看到,在我的/tmp目錄下的確是不存在facker的目錄或文件??梢钥闯?,-e這個東東是測試文件的存在與否的,那還有沒有其它EXPRESSION呢,答案是有的。

test語法如下:

[facker@facker6 tmp]$ test EXPRESSION FILENAME  #上面說的-e就是這里的EXPRESSION啦!

還有另外的一種語法格式:

[facker@facker6 tmp]$ [ EXPRESSION FILENAME ]


文件判斷

1、文件類型判斷

EXPRESSION 作用
  -e
判斷文件是否存在
  –b 判斷文件是否存在,并且是否為普通文件
  -d
判斷文件是否存在,并且是否為目錄
  -b 判斷文件是否存在,并且是否為塊設備文件(block file)
  -c 判斷文件是否存在,并且是否為字符設備文件
  -L 判斷文件是否存在,并且是否為符號連接文件
  -p 判斷文件是否存在,并且是否為管道文件
  -s 判斷文件是否存在,并且是否為空文件
  -S 判斷文件是否存在,并且是否為套接字文件

2、按照文件權限來判斷

EXPRESSION
作用
  -r
判斷文件是否存在,且對當前操作用戶是否擁有讀權限
  -w 判斷文件是否存在,且對當前操作用戶是否擁有寫權限
  -x
判斷文件是否存在,且對當前操作用戶是否擁有執行權限
  -u 判斷文件是否存在,并且SUID是否置位
  -g 判斷文件是否存在,并且SGID是否置位
  -k 判斷文件是否存在,并且SBit是否置位

3、按照文件被操作后的判斷

EXPRESSION
作用
  -t fd
判斷文件是否存在,且文件的描述符是否已經打開并且與某終端相關
  -N 判斷文件是否存在,且文件最后一次被讀取時內容是否修改
  -O
判斷文件是否存在,且當前操作用戶是否為文件的屬主
  -G 判斷文件是否存在,且文件與當前操作用戶是否為同一個屬組

4、兩個文件之間進行比較(雙目比較)

EXPRESSION
作用
文件1 -nt 文件2
判斷文件1的修改時間是否比文件2的新(多用于配置文件備份)
文件1 -ot 文件2 判斷文件1的修改時間是否比文件2的舊
文件1 -ef 文件2 判斷文件1和文件2的inode號是否一致(判斷是否為硬鏈接)

數值判斷

5、兩個整數之間進行比較(雙目比較)

EXPRESSION
作用
整數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

字符串判斷

6、兩個字符串之間進行比較

EXPRESSION
作用
-z 字符串
判斷字符串是否為空
-n 字符串
判斷字符串是否為非空
字符串1 == 字符串2
判斷字符串1是否和字符串2相等
字符串1 != 字符串2 判斷字符串1是否和字符串2不相等
字符串1 > 字符串2 判斷字符串1是否大于字符串2
字符串1 < 字符串2 判斷字符串1是否小于字符串2
字符串1 ~= 字符串2 判斷字符串1能否被右側的PATTERN所匹配,該表達式寫為 [[ 字符串1 ~= 字符串2 ]]

多重條件判斷

EXPRESSION
作用
判斷1 -a 判斷2
邏輯與,判斷1和判斷2都成立,結果為真
判斷1 -o 判斷2
邏輯或,判斷1和判斷2有一個成立,結果為真
! 判斷
邏輯非,使原始的判斷式取反

練習

好了,干貨分享完了,我們來幾道練習來驗證一下是不是真的可行吧。

習題1:測試文件test.conf是否要比test.conf.bak新,如果是,則更新test.conf.bak。

[facker@facker6 tmp]$ touch test.conf test.conf.bak  #通過touch命令創建兩個空白文件
[facker@facker6 tmp]$ echo 123 > test.conf           #向test.conf文件寫入123
[facker@facker6 tmp]$ cat test.conf test.conf.bak
 123 
[facker@facker6 tmp]$ [ test.conf -nt test.conf.bak ] && cp -f test.conf test.conf.bak || echo "File not change."
[facker@facker6 tmp]$ cat test.conf test.conf.bak    #如果兩個文件一致,則會輸出兩行123
 123
 123

習題2:測試當前用戶是否對/etc/shadow文件是否擁有讀寫權限。

[facker@facker6 tmp]$ whoami
 facker
[facker@facker6 tmp]$ ls -ld /etc/shadow  
 ---------- 1 root root 848 Dec 20 19:06 /etc/shadow  #shadow文件對于當前用戶來說是既不可讀也不可寫的
[facker@facker6 tmp]$ [ -r /etc/shadow -o -w /etc/shadow ] && echo "i can read or write this file." || echo "i do not have permission."
 i do not have permission.
[facker@facker6 tmp]$

 

參考資料

  • 《馬哥Linux教學》

  • 《鳥哥私房菜基礎篇》

原創文章,作者:facker,如若轉載,請注明出處:http://www.www58058.com/10312

(0)
fackerfacker
上一篇 2016-02-14 10:11
下一篇 2016-02-14 10:13

相關推薦

  • HA Cluster—Keepalived

    HA Cluster 集群類型:LB(lvs/nginx(http/upstream, stream/upstream))、HA、HP 系統可用性的公式:A=MTBF/(MTBF+MTTR) 系統故障: 硬件故障:設計缺陷、wear out、自然災害 軟件故障:設計缺陷 提升系統高用性的解決方案之降低MTTR: 解決方案:冗余(redundant) acti…

    Linux干貨 2017-10-30
  • sed講解與使用

            sed是一種流編輯器,它是文本處理中非常中的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理…

    Linux干貨 2016-08-15
  • Linux之sed的使用

    sed的工作原理         sed是一種流編輯器以行為單位來處理文本的一款功能十分強大的編輯器,一次只處理一行內容,當處理文本是,將要處理的行放置在模式空間里(緩沖區),接下來sed命令處理模式空間里的內容,處理完成后,把模式空間里處理后的內容送至屏幕打印輸出,接下來處理下…

    Linux干貨 2016-08-09
  • Linux系統之用戶和組

    Linux系統之用戶和組 1、什么是用戶 用戶:資源獲取標識符,資源分配,安全權限模型的核心要素之一 2、沒有用戶,操作系統可否正常執行? 答案是肯定的 在Linux系統上,用戶管理是基于用戶名和密碼的方式進行資源的分配, Username/UID分為以下類別:     管理員:root, 0  &…

    Linux干貨 2016-08-04
  • 一起學DHCP系列(四)安裝、配置

    原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://jeffyyko.blog.51cto.com/28563/162580       本節將主要講述DHCP的安裝和配置。     …

    Linux干貨 2015-03-25
  • LInux基本常識和幾個基本命令的用法

    1.默認系統管理員root 1)在Linux中,創建系統的同時,會創建一個超級用戶,對系統擁有絕對權限。 2)每個賬戶的文件都被放在各自的家目錄中,管理員家目錄:/root 3)每個帳號會有一個uid號對應,管理員uid=0   cengOS7之前的版本一般用戶uid從500開始   centOS7之后的版本一般用戶uid從1000開始 …

    Linux干貨 2016-07-23

評論列表(1條)

  • stanley
    stanley 2016-02-14 10:13

    內容專業,排版漂亮,已置頂

欧美性久久久久