shell內建命令test單雙括號的區別

2021-09-21 00:13:25 字數 3330 閱讀 1283

1、單括號test命令要對變數進行單詞分離,當變數值包含空白符時,要用引號將變數括起來;而雙括號的test命令不會對變數進行單詞分離。

以下情況分為變數為單個單詞,含有空格的片語。

[root@www yujia]# echo $name       

hello

[root@www yujia]# [ $name = "hello" ]

[root@www yujia]# echo $? 0

[root@www yujia]# [[ $name = "hello" ]]

[root@www yujia]# echo $?              0

[root@www yujia]#

得出結論,因為變數只有乙個單詞嘛,單雙括號的單詞分離都沒有影響到這個變數了。

[root@www yujia]# echo $name1       

hello world

[root@www yujia]# [ $name1 = "hello world" ]

-bash: [: too many arguments

[root@www yujia]# echo $? 2

[root@www yujia]# [ "$name1" = "hello world" ]

[root@www yujia]# echo $? 0

[root@www yujia]# [[ $name1 = "hello world" ]]

[root@www yujia]# echo $? 0

[root@www yujia]#

這次變數是乙個片語了,帶空格那種了。當我們要測試時,結果發現bash回應引數太多了,這是怎麼回事呢?原來是單引號test命令對變數進行單詞分離了,結果也就變成了

[ hello world = "hello world" ],多了那個字串hello,成了字串world和字串hello world之間的比較了。因此如果在單括號的test命令中的變數含有空格,但它還得和字串比較,那就必須給變數加個雙引號了,這時它就不會發生錯誤了。而在下面的雙括號的test命令中,即使變數含有空格又何妨,因為它不能對變數單詞進行分離嘛。

2、單方括號的test命令,通常用內建的test命令來測試表示式的值,test命令也被鏈結到方括號上。這樣,既可以使用單獨的test命令,也可以通過把表示式用單方括號括起來,來測試表示式的值。

[root@www yujia]# ll abc

-rw-r--r-- 1 root root 0 sep 24 08:59 abc

[root@www yujia]# test -r abc ; echo $? 0

[root@www yujia]# [ -r abc ] ; echo $?              0

[root@www yujia]#

3、單括號的test命令不對shell元字元進行擴充套件的,而雙括號test命令則會對shell元字元進行擴充套件的了。

[root@www yujia]# name=tom

[root@www yujia]# [ $name = t?? ]

[root@www yujia]# echo $? 1

[root@www yujia]# [[ $name = t?? ]]

[root@www yujia]# echo $?           0

[root@www yujia]#

4、在雙括號的test命令當中,如果乙個字串(不管含不含有空格)僅僅是在表示式中作為乙個普通字串,而不是乙個模式的一部分,則它也必須用引號括起來。

我的理解是如果乙個字串值(右邊那個的了)不加雙引號,那這個字串就是模式來的,如果它裡面有含有shell元字元,bash會對它進行擴充套件。如果字串加了雙引號,那它就是乙個很普通的字串的,即便字串裡面裡面含有特殊字元,也就是當普通內容來處理。

[root@www yujia]# echo $name

tom[root@www yujia]# echo $name1

tomm

[root@www yujia]# [[ $name = tom ]]      

[root@www yujia]# echo $? 0

[root@www yujia]# [[ $name = tom? ]]

[root@www yujia]# echo $?           1

[root@www yujia]# [[ $name1 = tom ]]

[root@www yujia]# echo $?           1

[root@www yujia]# [[ $name1 = tom? ]]

[root@www yujia]# echo $?            0

[root@www yujia]#

[root@www yujia]# [[ $name = "tom" ]]

[root@www yujia]# echo $?            0

[root@www yujia]# [[ $name = "tom?" ]]

[root@www yujia]# echo $?             1

[root@www yujia]# [[ $name1 = "tom" ]]

[root@www yujia]# echo $?              1

[root@www yujia]# [[ $name1 = "tom?" ]]

[root@www yujia]# echo $?              1

5、[ express1 –a express2 ] 這是放在單括號的test命令中的,因為單的不支援元字元擴充套件,因此就只能叫做表示式了,它們可以組合構成邏輯測試的,不過與或非使用( -a –o !)的形式。

[root@www yujia]# ll mm

-r--r--r-- 2 root root 644 sep 24 08:48 mm

[root@www yujia]# [ -r mm -a -x mm ]

[root@www yujia]# echo $? 1

[root@www yujia]#

[[pattern1 –a pattern1]] 這是放在雙括號test命令中的,因為單條式子可以支援元字元嘛,所以可以叫做模式表示式了,也就可以用於復合邏輯了,不過與或非使用(&& || !)的形式了。

[root@www yujia]# echo $name

tom[root@www yujia]# [[ $name = [tt]om && $name = t?? ]]

[root@www yujia]# echo $?

0[root@www yujia]#

Shell中的內建命令 test

比較 描述n1 eq n2 檢查n1是否與n2相等 n1 ge n2 檢查n1是否大於或等於n2 n1 gt n2 檢查n1是否大於n2 n1 le n2 檢查n1是否小於或等於n2 n1 lt n2 檢查n1是否小於n2 n1 ne n2 檢查n1是否不等於n2 比較描述 str1 str2 檢查...

shell基礎命令 test命令

test 相當於test命令 判斷a和b的值是否相等 test a b echo yes echo no a b echo yes echo no 等於 不等於 eq等於 ne不等於 le小於等於 lt小於 ge大於等於 gt大於 a的值為1 b的值為2 root rhel8 mnt a b ech...

Shell自我學習 Test命令

test命令用於檢查某個條件是否成立,可以進行數值 檔案和字元三個方面的測試。num1 1 num2 2 if test num1 eq num2 then echo num1 is equal num2 else echo num1 not equal num2 fi 輸出 num1 is equ...