Shell中 和 的異同

2021-08-11 18:05:44 字數 4382 閱讀 7035

[[,是關鍵字,許多shell(如ash bsh)並不支援這種方式。ksh, bash(據說從2.02起引入對[[的支援)等支援。

[是一條命令, 與test等價,大多數shell都支援。在現代的大多數sh實現中,」[「與」test」是內部(builtin)命令,換句話說執行」test」/」[「時不會調

(1)」-gt」, 「-lt」是算術比較操作符,用於比較整數的大小。

(2)」>」, 「<」是字串比較操作符,用於比較字串的大小,使用字典順序,與當前的locale有關。

(3)關於字串比較。[...][[...]]中都可以對字串進行比較,比較的順序是」字典順序」。對ascii字元來講,碼表中排列在前的較小,如a,就表示是字串比較,那麼9 > 100為真,因為這實際上等價於『9』 > 『100』,9在碼表中排在1後面,所以字串」9」大於字串」100」。只要搞清楚了何時是算術比較,何時是串比較,一般就不會出錯了。

(4)建議在使用數值比較的時候,使用let,(())命令,否則容易出錯;

範例:

「[「用法

$ [ 2

-lt10 ]&&echo

true&&echo

false

true

$ [ 2

-gt10 ]&&echo

true||echo

false

false

$ [ 2 \< 10 ]&&echo

true||echo

false

#you should use "\<"

false

$ [ 2 \> 10 ]&&echo

true||echo

false

#you should use "\>"

true

「[[「用法

$ [[ 2

-gt10 ]]&&echo

true||echo

false

false

$ [[ 2

-lt10 ]]&&echo

true||echo

false

true

$ [[ 2

< 10 ]]&&echo

true||echo

false

false

$ [[ 2 > 10 ]]&&echo

true||echo

false

true

這裡的模式匹配要簡單得多,類似檔名的統配符的擴充套件規則。還要注意等號右端的模式不能用引號括起,使用引用關閉了某些元字元的特殊功能

「[「用法

$ [ test = test ]&&echo

true||echo

false

#normal compare

true

$ [ test = t*t ]&&echo

true||echo

false

#pattern match.

true

$ [ test = t..t ]&&echo

true||echo

false

#not match.

false

$ [ test = t??t ]&&echo

true||echo

false

#note that "?", not "." stands for one single character here

true

$ [ test = "t??t" ]&&echo

true||echo

false

#alert: don't quote the pattern,使用引用關閉了?的特殊功能

false

「[[「用法

$ [[ test = test ]]&&echo

true||echo

false

#normal compare

true

$ [[ test = t*t ]]&&echo

true||echo

false

#pattern match.

true

$ [[ test = t..t ]]&&echo

true||echo

false

#not match.

false

$ [[ test = t??t ]]&&echo

true||echo

false

#note that "?", not "." stands for one single character here

true

$ [[ test = "t??t" ]]&&echo

true||echo

false

# alert: don't quote the pattern,使用引用關閉了?的特殊功能

false

邏輯與和邏輯或

(1)」[「:邏輯與:」-a」;邏輯或:」-o」;

(2)」[[「:邏輯與:」&&」;邏輯或:」||」

$ [[ 1

< 2 && b > a ]]&&echo true||echo false

true

$ [[ 1

< 2 -a b > a ]]&&echo true||echo false

bash: syntax error in conditional expression

bash: syntax error near `-

a'$ [ 1

< 2 -a b > a ]&&echo true||echo false

true

$ [ 1

< 2 && b > a ]&&echo true||echo false #wrong syntax

bash: [: missing `]'

false

$ [ 1

< 2 \&\& b > a ]&&echo true||echo false #aslo wrong

bash: [: &&: binary operator expected

false

命令列引數

(1)[ ... ]為shell命令,所以在其中的表示式應是它的命令列引數,所以串比較操作符」>」 與」<」必須轉義,否則就變成io重定向了;

(2)由於[[是關鍵字,不會做命令列擴充套件,所以在[[中<>不需轉義,但是相對的語法就稍嚴格些。例如在[ ... ]中可以用引號括起操作符,因為在做命令列擴充套件時會去掉這些引號,而在[[ ... ]]則不允許這樣做;

$ [ "-z"

"" ]&&echo true||echo false

true

$ [ -z "" ]&&echo true||echo false

true

$ [[ "-z"

"" ]]&&echo true||echo false

bash: conditional binary

operator expected

bash: syntax error near `""

'$ [[ -z "" ]]&&echo true||echo false

true

[[ ... ]]進行算術擴充套件,而[ ... ]不做
$ [[ 99+1 -eq 100 ]]&&echo true||echo false

true

$ [ 99+1 -eq 100 ]&&echo true||echo false

bash: [: 99+1: integer expression expected

false

$ [ $((99+1)) -eq 100 ]&&echo true||echo false

true

正規表示式匹配=~
regular expression match. this operator was introduced with version 3 of bash.

the =~ regular expression matching operator within a double brackets test expression.

參考這裡

shell中 和 的用法

格式 command1 command2 左邊的命令 命令1 返回真 即返回0,成功被執行 後,右邊的命令 命令2 才能夠被執行 換句話說,如果這個命令執行成功 那麼執行這個命令 命令之間使用 連線,實現邏輯與的功能。只有在 左邊的命令返回真 命令返回值 0 右邊的命令才會被執行。只要有乙個命令返回...

shell中 , 和 的區別

1.首先,儘管很相似,但是從概念上講,二者是不同層次的東西。是關鍵字,許多shell 如ash bsh 並不支援這種方式。ksh,bash 據說從2.02起引入對 的支援 等支援。是一條命令,與test等價,大多數shell都支援。在現代的大多數sh實現中,與 test 是內部 builtin 命令...

shell與cmd的異同

shell可以說是cmd的公升級版 補充版。當然shell在原來cmd基礎上做了很多修改 調整的,且增加了很多命令及命令別名。cmd和powershell都可以通過執行命令開啟,如圖。shell在原來cmd基礎上做了很多修改,包含命令名稱,色彩搭配等。shell命令與cmd命令差別示例,如圖。別名是...