shell指令碼----[]與[[ ]]的區別與聯絡
注意
[
和test
是
Shell 的內部命令,而[[
是Shell的關鍵字。
且 shell 以0作為true返回
#!/bin/bashif [ 0 ];then
echo "0"
fi
輸出 0
一、 [ ] 單雙括號
二、 [[ ]] 雙方括號
三、 比較
四、 [[ ]] 比[ ] 具備的優勢
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
shell和shell指令碼的區別
程式必須以下面的行開始(必須方在檔案的第一行):#!/bin/sh符號#!用來告訴系統它後面的引數是用來執行該檔案的程式。在這個例子中我們使用/bin/sh來執行程式。當編輯好指令碼時,如果要執行該指令碼,還必須使其可執行。要使指令碼可執行:編譯 chmod +x filename 這樣才能用./filena
shell指令碼----[]與[[ ]]的區別與聯絡
注意 [ 和test 是 Shell 的內部命令,而[[是Shell的關鍵字。 且 shell 以0作為true返回 #!/bin/bash if [ 0 ];then echo "0" fi 輸出 0 一、 [ ] 單雙括號 基本要素:
Makefile與shell指令碼區別
在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伺服器要想實現多個描述符的等待需要用多程序多執