1. 程式人生 > >shell中單中括號與雙中括號的區別

shell中單中括號與雙中括號的區別

1.單括號TEST命令要對變數進行單詞分離,當變數值包含空白符時,要用引號將變數括起來;而雙括號的TEST命令不會對變數進行單詞分離。 以下情況分為變數為單個單詞,含有空格的片語。 [[email protected] yansan]# echo $name hello [[email protected] yansan]# [ $name = "hello" ] [[email protected] yansan]# echo $? 0 [[email protected] yansan]# [[ $name = "hello" ]] [[email protected]
yansan]# echo $? 0 [[email protected] yansan]# 得出結論,因為變數只有一個單詞嘛,單雙括號的單詞分離都沒有影響到這個變量了。 [[email protected] yansan]# echo $name1 hello world [[email protected] yansan]# [ $name1 = "hello world" ] -bash: [: too many arguments [[email protected] yansan]# echo $? 2 [[email protected]
yansan]# [ "$name1" = "hello world" ] [[email protected] yansan]# echo $? 0 [[email protected] yansan]# [[ $name1 = "hello world" ]] [[email protected] yansan]# echo $? 0 [[email protected] yansan]# 這次變數是一個片語了,帶空格那種了。當我們要測試時,結果發現BASH迴應引數太多了,這是怎麼回事呢?原來是單引號TEST命令對變數進行單詞分離了,結果也就變成了 [ hello world = "hello world" ],多了那個字串hello,成了字串world和字串hello world之間的比較了。因此如果在單括號的TEST命令
的變數含有空格,但它還得和字串比較,那就必須給變數加個雙引號了,這時它就不會發生錯誤了。而在下面的雙括號的TEST命令,即使變數含有空格又何妨,因為它不能對變數單詞進行分離嘛。 2.單方括號的TEST命令,通常用內建的TEST命令來測試表達式的值,TEST命令也被連結到方括號上。這樣,既可以使用單獨的TEST命令,也可以通過把表示式用單方括號括起來,來測試表達式的值。 [[email protected] yansan]# ll abc -rw-r--r-- 1 root root 0 Sep 24 08:59 abc [[email protected] yansan]# test -r abc ; echo $? 0 [[email protected] yansan]# [ -r abc ] ; echo $?              0 [[email protected] yansan]# 3.單括號的TEST命令不對SHELL元字元進行擴充套件的,而雙括號TEST命令則會對SHELL元字元進行擴充套件的了。 [[email protected] yansan]# name=tom [[email protected] yansan]# [ $name = t?? ] [[email protected] yansan]# echo $? 1 [[email protected] yansan]# [[ $name = t?? ]] [[email protected] yansan]# echo $? 0 [[email protected] yansan]# 4.在雙括號的TEST命令當,如果一個字串(不管含不含有空格)僅僅是在表示式作為一個普通字串,而不是一個模式的一部分,則它也必須用引號括起來。 我的理解是如果一個字串值(右邊那個的了)不加雙引號,那這個字串就是模式來的,如果它裡面有含有SHELL元字元,BASH會對它進行擴充套件。如果字串加了雙引號,那它就是一個很普通的字串的,即便字串裡面裡面含有特殊字元,也就是當普通內容來處理。 [[email protected] yansan]# echo $name tom [[email protected] yansan]# echo $name1 tomm  [[email protected] yansan]# [[ $name = tom ]]       [[email protected] yansan]# echo $? 0 [[email protected] yansan]# [[ $name = tom? ]] [[email protected] yansan]# echo $?           1 [[email protected] yansan]# [[ $name1 = tom ]] [[email protected] yansan]# echo $?           1 [[email protected] yansan]# [[ $name1 = tom? ]] [[email protected] yansan]# echo $?            0 [[email protected] yansan]# [[email protected] yansan]# [[ $name = "tom" ]] [[email protected] yansan]# echo $?            0  [[email protected] yansan]# [[ $name = "tom?" ]] [[email protected] yansan]# echo $?             1  [[email protected] yansan]# [[ $name1 = "tom" ]] [[email protected] yansan]# echo $?              1 [[email protected] yansan]# [[ $name1 = "tom?" ]] [[email protected] yansan]# echo $?              1 5 [ express1 –a express2 ] 這是放在單括號的TEST命令的,因為單的不支援元字元擴充套件,因此就只能叫做表示式了,它們可以組合構成邏輯測試的,不過與或非使用( -a –o !)的形式。 [[email protected] yansan]# ll mm -r--r--r-- 2 root root 644 Sep 24 08:48 mm [[email protected] yansan]# [ -r mm -a -x mm ] [[email protected] yansan]# echo $? 1 [[email protected] yansan]# [[pattern1 –a pattern1]] 這是放在雙括號TEST命令的,因為單條式子可以支援元字元嘛,所以可以叫做模式表示式了,也就可以用於複合邏輯了,不過與非或使用(&& || !)的形式了。

[[email protected] yansan]# echo $name
tom
[[email protected] yansan]# [[ $name = [tT]om && $name = t?? ]]
[[email protected] yansan]# echo $?
0
[[email protected] yansan]#

相關推薦

shell括號括號區別

1.單括號TEST命令要對變數進行單詞分離,當變數值包含空白符時,要用引號將變數括起來;而雙括號的TEST命令不會對變數進行單詞分離。 以下情況分為變數為單個單詞,含有空格的片語。 [[email protected] yansan]# echo $nam

linux指令碼括號括號區別

在 Bash 4.3.11 測試: POSIX vs Bash 擴充套件: [ 是 POSIX[[ is 一個 Bash 擴充套件常規命令 vs 魔法 [ 只是一個有著奇怪名字的常規命令。 ] is just an argument of [ that prevents further argumen

探索C語言引號引號的區別

今天看了《C陷阱與缺陷》中對””與’’的描述,’’引起的一個字元代表一個整數,整數值對應於該字元在編譯器採用的字符集中的序列值;””引起的字串代表的是一個指向無名陣列起始字元的指標。對這兩個符號產生了興趣,遂開啟VS2010查看了單引號、雙引號引起的字元在記憶體中的儲存形式

SQL引號引號的區別

當 SET QUOTED_IDENTIFIER 為 ON 時,識別符號可以由雙引號分隔,而文字必須由單引號分隔。當 SET QUOTED_IDENTIFIER 為 OFF 時,識別符號不可加引號,且必須符合所有 Transact-SQL 識別符號規則。有關詳細資訊,請參閱識別符號。文字可以由單引號或雙引號分

java引號引號的區別?hashcode()和equals()

單引號引的資料 是char型別的 雙引號引的資料 是String型別的 單引號只能引一個字元 而雙引號可以引0個及其以上 hashcode這個方法是用來鑑定2個物件是否相等的。 一般來講,equals這個方法是給使用者呼叫的,如果你想判斷2個物件是否相

python(七) Python下劃線和下劃線

www www. 自己 pro improt 分類 鏈接 默認 question Python中單下劃線和雙下劃線: 一、分類 (1)、以單下劃線開頭,表示這是一個保護成員,只有類對象和子類對象自己能訪問到這些變量。 以單下劃線開

Python下劃線和下劃線有啥區別

__func__:一種約定,Python內部的名字,用來區別其他使用者自定義的命名,以防衝突。 _func:     一種約定,用來指定私有變數或私有函式(private) __func:   如果類中有一個方法與另外一個類中的一個方法同名了

shell '>' ‘>>’ 的區別

在shell中 '>'  為建立: echo “hello shell”  > out.txt '>>' 為追加:echo “hello shell”  >> out.txt 當out.txt 文字不存在時,'>'與

Java例模式簡單工廠模式的簡單例項介紹

1:單例設計模式 單例模式也稱為單件模式、單子模式,可能是使用最廣泛的設計模式。其目的是保證一個類僅有一個例項,並提供一個訪問它的全域性訪問點,該例項被所有程式模組共享。單例模式又包含 餓漢式和懶漢式

理解Java字符流字節流的區別

png 技術 print 復制代碼 bar 顯式 數字 length ava 1. 什麽是流 Java中的流是對字節序列的抽象,我們可以想象有一個水管,只不過現在流動在水管中的不再是水,而是字節序列。和水流一樣,Java中的流也具有一個“流動的方向”,通常可以從中讀

jQuery$(documnet).ready(function(){})window.onload=function(){}區別

時間 span 圖片 執行 數量 執行時間 加載 doc fun 1.執行時間區別:        $(document).ready(function(){})簡寫為$(function(){}),在頁面框架加載完成之後執行。        window.onload=

JavaJavadoc的{@link}@see的簡單區別

java http 技術 pan lan 分享圖片 參考 article 圖片 {@link}與@see這兩個Javadoc註解都可以直接鏈接類和方法。用法基本一致。 但是@see必須頂頭寫,而{@link可以任意地方},如下所示: 參考: http:

numpyint類型python的int

nbsp python pan num blog res port numpy log 【code】 import numpy as np nparr = np.array([[1 ,2, 3, 4]]) np_int32 = nparr[0][0] # np_in

PHParray_merge函數array+array的區別

合並 方式 () gear 合並數組 個數 clas 當下 php 在PHP中可以使用array_merge函數和兩個數組相加array+array的方式進行數組合並,但兩者效果並不相同,下面為大家介紹兩者具體的使用區別. 區別如下: 當下標為數值時,array_merg

Java字符流字節流的區別

重載方法 二進制 抽象類 相同 緩沖區 pre pub 不支持 之間 1. 什麽是流 Java中的流是對字節序列的抽象,我們可以想象有一個水管,只不過現在流動在水管中的不再是水,而是字節序列。和水流一樣,Java中的流也具有一個“流動的方向”,通常可以從中讀入一個字

three.jsrender渲染器htmlbody顯示之間的聯絡

  方法一: three.js中生成html5中的body。 <body onload="draw();"> </body> function initRender() { renderer = new THREE.WebGLRender

Java s = s+1 s +=1 的區別

問題: public class Operator { public static void main(String[] args) { opreator1(); opreator2(); } private static void opreator1() { short

APPium連線真機輸入框輸入的內容程式碼不一致

今天解決了上一個問題,又碰到了一個新的問題。 問題:連線真機輸入框中輸入的內容與程式碼中不一致。 描述: 想實現登入頁面輸入使用者名稱和密碼自動登入,可是在輸入使用者名稱和密碼的框中輸入的內容總是與程式碼中的不一致,初步感覺到應該和輸入發有關係,於是把使用者名稱和密碼都換成數字可以成功登入,但是真實的使

python list extend()append()區別

def changextend(str): "print string with extend" mylist.extend([40,50,60]); print(mylist) return def changeappend(str): mylist.append([7,8,9

Pythoni = i + 1i + = 1的區別

print nbsp div end 修改 append 變量 += 操作 +=是對原本的實例做加1運算,l=l+[1]是對l+[1]之後重新把值賦給叫l的變量(和原來的l不同) 區別在於,一個修改數據結構本身(就地操作)b + = 1而另一個只是重新分配變量a = a