[[ ]] 是咱們比較熟悉的符號了,從第一篇開始咱們就一直在用,但我一直沒有詳細介紹它的用法,只用到了它的一小部分功能。本文詳細介紹 [[ ]] 的用法。git
[[ ]] 最經常使用的功能之一是比較字符串,這也是咱們一直在用的功能。github
# 匹配
% [[ abc == abc ]] && echo good
good
# = 和 == 是同樣的,最好統一使用一種
% [[ abc = abc ]] && echo good
good
# 不匹配
% [[ abc != abd ]] && echo good
good
# 正則表達式匹配
% [[ abc =~ a.c ]] && echo good
good
# 前者字符序比後者小
% [[ abc < bcd ]] && echo good
good
# 前者字符序比後者大
% [[ cde > bcd ]] && echo good
good
# 沒有 >= 和 <=
% [[ cde >= bcd ]] && echo good
zsh: parse error near `bcd'複製代碼
除了在裏邊用等號、不等號之類比較外,還能夠判斷字符串是否爲空:正則表達式
% str=abc
# 判斷字符串內容長度是否大於 0,等同於 (($#str))
% [[ -n "$str" ]] && echo good
good
% str=""
# 判斷字符串是否爲空,等同於 ((! $#str))
% [[ -z "$str" ]] && echo good
good複製代碼
但這兩種用法,咱們都有更方便的其餘實現方法,沒有必要用它們。bash
[[ ]] 另外一類很重要的功能是判斷文件,好比判斷某一個文件是否存在、是不是目錄、是否可讀等等。微信
判斷 /bin/zsh 文件是否存在:網絡
% [[ -e /bin/zsh ]] && echo good
good
% [[ -e /bin/zshh ]] && echo good複製代碼
-e 能夠替換成以下的選項,用法是一致的:socket
選項 | 符合條件的文件 |
---|---|
-b | 塊設備文件 |
-c | 字符設備文件 |
-d | 目錄 |
-e | 存在的任何文件 |
-f | 普通文件,含符號連接,不含目錄、設備文件、socket、FIFO |
-g | 設置了 setgid 的文件 |
-h | 符號連接 |
-k | 設置了粘滯位(sticky bit)的文件 |
-p | FIFO 文件 |
-r | 對當前進程可讀的文件 |
-s | 非空文件 |
-u | 設置了 setuid 的文件 |
-x | 對當前進程可執行的文件 |
-w | 對當前進程可寫的文件 |
-L | 符號連接(同 -h) |
-O | 被當前進程的用戶擁有的文件 |
-G | 被當前進程的用戶組擁有的文件 |
-S | socket 文件 |
-N | atime 和 mtime 同樣的文件 |
還有一個比較特殊的 -t 選項:ide
# $$ 是當前的進程 id
% ls /proc/$$/fd
0 1 10 11 2
% [[ -t 10 ]] && echo good
good
% [[ -t 3 ]] && echo good複製代碼
-t 後要接數字(若是不是,至關於 0),判斷當前進程是否打開了對應的 fd(進程默認會打開 0、一、2 這三個 fd,分別對應標準輸入、標準輸出和錯誤輸出,此外每打開一個文件、管道或者網絡鏈接,都會對應一個 fd,關掉後對應 fd 會消失)。ui
除了判斷單個文件是否符合條件外,[[ ]] 還能夠用來比較兩個文件。spa
# file1 比 file2 新
% [[ file1 -nt file2 ]]
# file1 比 file2 舊
% [[ file1 -ot file2 ]]
# file1 和 file2 是否對應同一個文件(路徑相同或者互爲硬鏈接)
% [[ file1 -ef file2 ]]複製代碼
[[ ]] 也能夠用來比較數值,注意不是用等號、大於號、小於號等等比較,有一系列專門的符號。一般咱們不必用 [[ ]] 來比較數值,用 (( )) 更方便一些。
# -eq 是判斷兩個數值是否相等
% [[ 12 -eq 12 ]] && echo good
good複製代碼
-eq 能夠替換成下列符號,用法同樣:
符號 | 含義 |
---|---|
-eq | 相等 |
-ne | 不相等 |
-lt | < |
-gt | > |
-le | <= |
-ge | >= |
# && 是邏輯與
% [[ a == a && b == b ]] && echo good
good
# || 是邏輯或
% [[ a == a || a == b ]] && echo good
good
# ! 是邏輯非
% [[ ! a == b ]] && echo good
good
# 能夠一塊兒用,! 優先級最高,其次 &&,再次 ||
% [[ ! a == b && b == a || b == b ]] && echo good
good
# 若是不肯定優先級,能夠加小括號
% [[ ((! a == b) && b == a) || b == b ]] && echo good
good複製代碼
須要注意一下空格,[[ ]] 內側和內容之間須要空格隔開,== 兩邊也須要空格。若是是在 zsh 中直接敲入,! 後邊也要加一個空格,否則會被解析成歷史命令。
除了 [[ ]] 符號,[ ] 符號(它是古老的 test 命令化身)也能夠用來判斷字符串、文件、數值等等,但功能沒有 [[ ]] 全,只支持上邊列的一部分功能(不支持 ==、=~、>、<、(、) ,而且邏輯與或的語法不同,不能調整優先級,用起來很不方便),一般沒有必要使用 [ ](如需使用,能夠 man test 查看用法)。
本文詳細介紹了 [[ ]] 的用法,基本覆蓋全面了。
全系列文章地址:github.com/goreliu/zsh…
付費解決 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等領域相關問題,靈活訂價,歡迎諮詢,微信 ly50247。