Zsh 開發指南(第十二篇 [[ ]] 的用法)

導讀

[[ ]] 是咱們比較熟悉的符號了,從第一篇開始咱們就一直在用,但我一直沒有詳細介紹它的用法,只用到了它的一小部分功能。本文詳細介紹 [[ ]] 的用法。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 查看用法)。

總結

本文詳細介紹了 [[ ]] 的用法,基本覆蓋全面了。

參考

www.bash2zsh.com/zsh_refcard…

全系列文章地址:github.com/goreliu/zsh…

付費解決 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等領域相關問題,靈活訂價,歡迎諮詢,微信 ly50247。

相關文章
相關標籤/搜索