1. 程式人生 > >shell指令碼----[]與[[ ]]的區別與聯絡

shell指令碼----[]與[[ ]]的區別與聯絡

注意 [ 和test 是 Shell 的內部命令,而[[是Shell的關鍵字。 且 shell 以0作為true返回

#!/bin/bash
if [ 0 ];then
    echo "0"
fi  
輸出 0

 [  ] 單雙括號

基本要素:

  [ ] 兩個符號左右都要有空格分隔

  內部操作符與操作變數之間要有空格:如  [  “a”  =  “b”  ]

  字串比較中,> < 需要寫成\> \< 進行轉義

[ ] 中字串或者${}變數儘量使用"" 雙引號擴住,避免值未定義引用而出錯的好辦法

  [ ] 中可以使用 –a –o 進行邏輯運算

  [ ] 是bash 內建命令:[ is a shell builtin

[ ] 實際上是bash 中 test 命令的簡寫。即所有的 [ expr ] 等於 test expr。

 [[  ]] 雙方括號

基本要素:

  [[ ]] 兩個符號左右都要有空格分隔

  內部操作符與操作變數之間要有空格:如  [[  “a” =  “b”  ]]

 字串比較中,可以直接使用 > < ,無需轉義

  [[ ]] 中字串或者${}變數儘量如未使用"" 雙引號擴住的話,會進行模式和元字元匹配,例如:如果*沒有被雙引號擴住,可以匹配所有字元

例如:

[[email protected]

lxjwork]$ [[ "ab"=a* ]] && echo "ok"

ok

  [[]] 內部可以使用 &&  || 進行邏輯運算

  [[ ]] 是bash  keyword:[[ is a shell keyword

[[ ]] 其他用法都和[ ] 一樣

  [[ ]] 和 [ ] 都可以和 ! 配合使用

優先順序 

 !  >  && > || 

邏輯運算子  < 關係運算符

邏輯運算子  : !  &&  || -a  -o

關係運算符  : <  >  \> \<  ==  = !=  – eq –ne  -gt -ge  –lt  -le

三、 比較

[[]] 運算子只是[]運算子的擴充。 [[]] 能夠支援<,>符號運算不需要轉義符,[]中必須轉義:\> \< 。

[[]]是以字串比較大小。裡面支援邏輯運算子:&& ||  ,不再使用-a -o  。

對 test 命令來說, 用 -eq 要進行數字比較,而你此時傳入字串,就報錯了。

[[ expr ]] 是bash中真正的條件判斷語句,其語法更符合程式設計習慣 (比如 &&, || 的用法),在 [[ ]] 中 故意傳字串給 -eq 不會報錯,bash實現中直接把非整數的字串直接轉換成了 0 (你可以自行驗證,在 [[ ]] 中的,任何需要整數,但是提供又是其它不能轉換成整數的字串,都變成了0)。 這應該是bash實現中的沒有對 [[ ]] 中 -eq 操作符兩邊的內容進行檢查導致的。 對於我們來說,沒必要鑽這些東西,我們應該保證自己程式碼中的需要用到整數的時候,總是提供整數。

四、 [[  ]] 比[ ] 具備的優勢

①[[是 bash 程式語言的關鍵字。並不是一個命令,[[ ]] 結構比[ ]結構更加通用。在[[和]]之間所有的字元都不會發生檔名擴充套件或者單詞分割,但是會發生引數擴充套件和命令替換。

②支援字串的模式匹配,使用=~操作符時甚至支援shell的正則表示式。字串比較時可以把右邊的作為一個模式,而不僅僅是一個字串,比如[[ hello == hell? ]],結果為真。[[ ]] 中匹配字串或萬用字元,不需要引號。

③使用[[ ... ]]條件判斷結構,而不是[... ],能夠防止指令碼中的許多邏輯錯誤。比如,&&、||、<和> 操作符能夠正常存在於[[ ]]條件判斷結構中,但是如果出現在[ ]結構中的話,會報錯。

④bash把雙中括號中的表示式看作一個單獨的元素,並返回一個退出狀態碼。

使用[[ ... ]]條件判斷結構, 而不是[ ... ], 能夠防止指令碼中的許多邏輯錯誤. 比如,&&, ||, <, 和> 操作符能夠正常存在於[[]]條件判斷結構中, 但是如果出現在[ ]結構中的話, 會報錯。

Shell test 單中括號[] 雙中括號[[]] 的區別

在寫Shell指令碼的時候,經常在寫條件判斷語句時不知道該用[] 還是 [[]],首先我們來看他們的類別:


$type [ [[ test
[ is a shell builtin
[[ is a shell keyword
test is a shell builtin

[ 和test 是 Shell 的內部命令,而[[是Shell的關鍵字。


$test -f settings.py && echo True
True

$[ -f settings.py ] && echo True
True

[ 和test 是相等的。


$[ 2 < 1 ] && echo True || echo False
True

$[[ 2 < 1 ]] && echo True || echo False
False

既然是命令, 它就和引數組合為一體被 shell 解釋,那樣比如 ">" "<" 就被 shell 解釋為重定向符號了。關鍵字卻不這樣。


x=1
y=1


$[ $x == 1 && $y == 1 ] && echo True || echo False
-bash: [: missing `]'
False


$[[ $x == 1 && $y == 1 ]] && echo True || echo False
True


$[ $x == 1 -a $y == 1 ] && echo True || echo False
True

[[中使用&&||表示邏輯與和邏輯或。[中使用-a 和-o 表示邏輯與和邏輯或。


$[[ 'abcd' == a*d ]] && echo True || echo False
True


$[ 'abcd' == a*d ] && echo True || echo False
False

[[支援字串的模式匹配,使用=~操作符時甚至支援shell的正則表示式。字串比較時可以把右邊的作為一個模式,而不僅僅是一個字串,比如[[ hello == hell? ]],結果為真。[[ ]] 中匹配字串或萬用字元,不需要引號。

總結:

使用[[ ... ]]條件判斷結構,而不是[ ... ],能夠防止指令碼中的許多邏輯錯誤。比如,&&、||、<和> 操作符能夠正常存在於[[ ]]條件判斷結構中,

但是如果出現在[ ]結構中的話,會報錯。比如可以直接使用if [[ $a != 1 && $a != 2 ]]

如果不使用雙括號, 則為if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]

bash把雙中括號中的表示式看作一個單獨的元素,並返回一個退出狀態碼。


$[ !(pip list | grep pip) ] && echo True || echo False
-bash: [: too many arguments
False


$[[ !(pip list | grep pip) ]] && echo True || echo False
True

參考

http://blog.csdn.net/taiyang1987912/article/details/39551385
http://blog.csdn.net/yongan1006/article/details/7195303

相關推薦

Linux環境變數、使用者變數和shell變數的區別聯絡

1.shell簡介 shell是指為使用者提供操作介面的軟體,不同作業系統有著不同的shell,同一個作業系統也有著不同的shell。shell分為兩大類:圖形介面shell和命令列式shell。 圖形介面shell:windows作業系統下常用的windows Expl

jenkins遠端部署使用shell指令碼進行備份find和grep匹配的區別

需求 公司想jenkins在遠端部署專案的同時,還要進行專案備份, 之前只備份最近一次構建的資料,也就是隻保留到一份, 現在公司希望能保留按時間進行倒序,保留三份備份包。 思路 1、使用rm -rf 檔名把我們要保留的三份備份包排除掉。 2、要排除查

shell 指令碼的講解 應用

shell指令碼程式設計 作用:通過命令列解析的方式,自動執行設定好的程式或命令程式碼。(若將指令碼掛到定時任務中,就會自動在非工作時間裡自動觸發執行程式)   Shell指令碼檔案以“.sh”結尾 規範的Shell指令碼第一行會指出由哪個程式(直譯器)來執行指令碼中的內容。在linux b

分享70個經典的 Shell 指令碼面試題答案

我們為你的面試準備選擇了 70 個你可能遇到的 shell 指令碼面試問題及解答。瞭解指令碼或至少知道基礎知識對系統管理員來說至關重要,它也有助於你在工作環境中自動完成很多工。在過去的幾年裡,我們注意到所有的 linux 工作職位都要求指令碼技能。 1) 如何向指令碼傳遞引

shell指令碼常用命令方法總結

工作中shell指令碼,經常用的語法,整理了下 1 echo帶色的 列印字串帶色(31紅色,32綠色,33黃色,34藍色) 列印字串背景帶色 (40黑色,41紅色,42綠色,黃色43,藍色44,白色47) echo -e “\

Linux shell指令碼的建立執行

在進行linux測試時編寫指令碼是必不可少的。最近經常使用Linux,感覺太頻繁地敲擊鍵盤有些累了,於是想到了Shell指令碼。可以把太多的命令寫成一個指令碼,這樣每次執行一遍  shell檔案,就可以省去了敲擊鍵盤的時間。於是在網上搜了一些有關Linux下指令碼程式設計

shell指令碼的建立執行

指令碼的開頭(第一行): 規範的指令碼在指令碼的第一行會指出由哪個程式(直譯器)來執行指令碼中的內容 在linux bash的程式設計中一般為: #!/bin/bash

linux邊學邊記---Shell指令碼的追蹤debug

[[email protected] ~]#sh [-nvx] scripts.sh 引數: -n:不執行指令碼,僅僅查詢語法錯誤 -v:執行指令碼前,先將指令碼scripts的內容輸出到螢幕上 -x:將使用到的指令碼內容顯示到螢幕上。

day 69 shell指令碼的執行變數

20.1 shell指令碼介紹 shell是一種指令碼語言  可以使用邏輯判斷、迴圈等語法 可以自定義函式 shell是系統命令的集合 shell指令碼可以實現自動化運維,能大大增加我們的運維效率20.2 shell指令碼結構和執行 開頭需要加#!/bin/bash

shell 指令碼的學習使用(一)

shell 本身是一個用 c 語言編寫的程式,又是一種解釋型的語言。 是使用者使用 Liunx 的橋樑 shell 兩種執行命令的方式 1> 互動式 interactive : 解釋執行使用者的命令 , 使用者輸入一條命令, shell 就

IC數字前端設計開發18 (用shell指令碼編寫區別兩個資料夾內檔案的不同)

#!/bin/bash mkdir tmp basedir="./tmp" workdir="./" #這是定義兩個目錄,按照你的說法,這兩個目錄下檔名應該都是相同的 dir1="txt_test0" dir2="txt_test1" #這是用來儲存查詢di

shellshell指令碼區別

程式必須以下面的行開始(必須方在檔案的第一行):#!/bin/sh符號#!用來告訴系統它後面的引數是用來執行該檔案的程式。在這個例子中我們使用/bin/sh來執行程式。當編輯好指令碼時,如果要執行該指令碼,還必須使其可執行。要使指令碼可執行:編譯 chmod +x filename 這樣才能用./filena

shell指令碼----[][[ ]]的區別聯絡

注意 [ 和test 是 Shell 的內部命令,而[[是Shell的關鍵字。 且 shell 以0作為true返回 #!/bin/bash if [ 0 ];then     echo "0" fi   輸出 0 一、 [  ] 單雙括號 基本要素:   

Makefileshell指令碼區別

在Makefile可以呼叫shell指令碼,但是Makefile和shell指令碼是不同的。本文試著歸納一下Makefile和shell指令碼的不同。 1、 shell中所有引用以$打頭的變數其後要加{},而在Makefile中的變數是以$打頭的後加()。例項如下: Make

Linux shell指令碼開頭#!/bin/bash和#!/bin/sh介紹區別

一直以為在Linux shell指令碼中#都是代表著註釋功能,同樣在指令碼開始的#!/bin/sh也只是告訴使用者這是一個shell指令碼,最近查了下,才發現不是這個意思,分享下。 一、意思 #!/bin/sh是指此指令碼使用/bin/sh來解釋執行,#!是特殊的表示符,其後面跟的是此解釋此指令碼的she

shell指令碼配置環境變數時 source XXX.sh ./XXX.sh的區別

配置當前終端的環境變數,寫一個指令碼來執行,但./XXX.sh的時候,腳本里面列印PATH是改了,但是在終端echo $PATH卻沒有看到變化,因為這樣執行等於說不在當前程序 換source XXX.sh或. XXX.

bash shell數值比較(-eq)字符比較(==)的區別

整數比較 ron shell 時間 導致 erro opera 10.10 在線 運維中經常編寫腳本時,如果遇到使用變量間歇取值並和整數進行比較時,大多數人第一時間會想到使用"-eq"進行比較,但事實中如果因特殊原因導致變量取值為空(null)時,bas

shell [ ] [[ ]] 區別

shel log 分享圖片 命令 判斷 style 為我 包含 bubuko [ ] 與[[ ]] 均可以判斷變量是否為空, [ $a ] [[ $a ]] [ ! $a ] [[ ! $a ]] 無區別 在Linux中,我們可以使用test命令判斷一個字符串是否為空,

終端(terminal)、shell、tty、控制臺(console)、bash之間的區別聯系

https 電視 min ksh ctrl+ 編輯 按鈕 urn 用戶 1、終端(termimal)= tty(Teletypewriter, 電傳打印機),作用是提供一個命令的輸入輸出環境,在linux下使用組合鍵ctrl+alt+T打開的就是終端,可以認為termina

關於TCP ,select,epoll伺服器的區別聯絡

        select,poll,epoll都是IO多路複用的機制。I/O多路複用就通過一種機制,可以監視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程式進行相應的讀寫操作。而TCP伺服器要想實現多個描述符的等待需要用多程序多執