亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Linux Shell > 正文

shell中各種括號的作用詳解()、(())、[]、[[]]、{}(推薦)

2020-07-27 18:51:38
字體:
來源:轉載
供稿:網友

一、小括號,圓括號()

1、單小括號 ()

 ?、倜罱M。括號中的命令將會新開一個子shell順序執行,所以括號中的變量不能夠被腳本余下的部分使用。括號中多個命令之間用分號隔開,最后一個命令可以沒有分號,各命令和括號之間不必有空格。

  ②命令替換。等同于`cmd`,shell掃描一遍命令行,發現了$(cmd)結構,便將$(cmd)中的cmd執行一次,得到其標準輸出,再將此輸出放到原來命令。有些shell不支持,如tcsh。

 ?、塾糜诔跏蓟瘮到M。如:array=(a b c d)

2、雙小括號 (( ))

  ①整數擴展。這種擴展計算是整數型的計算,不支持浮點型。((exp))結構擴展并計算一個算術表達式的值,如果表達式的結果為0,那么返回的退出狀態碼為1,或者 是"假",而一個非零值的表達式所返回的退出狀態碼將為0,或者是"true"。若是邏輯判斷,表達式exp為真則為1,假則為0。

 ?、谥灰ㄌ栔械倪\算符、表達式符合C語言運算規則,都可用在$((exp))中,甚至是三目運算符。作不同進位(如二進制、八進制、十六進制)運算時,輸出結果全都自動轉化成了十進制。如:echo $((16#5f)) 結果為95 (16進位轉十進制)

 ?、蹎渭冇?(( )) 也可重定義變量值,比如 a=5; ((a++)) 可將 $a 重定義為6

  ④常用于算術運算比較,雙括號中的變量可以不使用$符號前綴。括號內支持多個表達式用逗號分開。 只要括號中的表達式符合C語言運算規則,比如可以直接使用for((i=0;i<5;i++)), 如果不使用雙括號, 則為for i in `seq 0 4`或者for i in {0..4}。再如可以直接使用if (($i<5)), 如果不使用雙括號, 則為if [ $i -lt 5 ]。

二、中括號,方括號[]

1、單中括號 []

  ①bash 的內部命令,[和test是等同的。如果我們不用絕對路徑指明,通常我們用的都是bash自帶的命令。if/test結構中的左中括號是調用test的命令標識,右中括號是關閉條件判斷的。這個命令把它的參數作為比較表達式或者作為文件測試,并且根據比較的結果來返回一個退出狀態碼。if/test結構中并不是必須右中括號,但是新版的Bash中要求必須這樣。

 ?、赥est和[]中可用的比較運算符只有==和!=,兩者都是用于字符串比較的,不可用于整數比較,整數比較只能使用-eq,-gt這種形式。無論是字符串比較還是整數比較都不支持大于號小于號。如果實在想用,對于字符串比較可以使用轉義形式,如果比較"ab"和"bc":[ ab /< bc ],結果為真,也就是返回狀態為0。[ ]中的邏輯與和邏輯或使用-a 和-o 表示。

 ?、圩址秶?。用作正則表達式的一部分,描述一個匹配的字符范圍。作為test用途的中括號內不能使用正則。

  ④在一個array 結構的上下文中,中括號用來引用數組中每個元素的編號。

2、雙中括號[[ ]]

 ?、賉[是 bash 程序語言的關鍵字。并不是一個命令,[[ ]] 結構比[ ]結構更加通用。在[[和]]之間所有的字符都不會發生文件名擴展或者單詞分割,但是會發生參數擴展和命令替換。

 ?、谥С肿址哪J狡ヅ?,使用=~操作符時甚至支持shell的正則表達式。字符串比較時可以把右邊的作為一個模式,而不僅僅是一個字符串,比如[[ hello == hell? ]],結果為真。[[ ]] 中匹配字符串或通配符,不需要引號。

 ?、凼褂肹[ ... ]]條件判斷結構,而不是[ ... ],能夠防止腳本中的許多邏輯錯誤。比如,&&、||、<和> 操作符能夠正常存在于[[ ]]條件判斷結構中,但是如果出現在[ ]結構中的話,會報錯。比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不適用雙括號, 則為if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ]。

 ?、躡ash把雙中括號中的表達式看作一個單獨的元素,并返回一個退出狀態碼。

例子:

if ($i<5) if [ $i -lt 5 ] if [ $a -ne 1 -a $a != 2 ] if [ $a -ne 1] && [ $a != 2 ] if [[ $a != 1 && $a != 2 ]] for i in $(seq 0 4);do echo $i;done for i in `seq 0 4`;do echo $i;done for ((i=0;i<5;i++));do echo $i;done for i in {0..4};do echo $i;done

三、大括號、花括號 {}

1、常規用法

 ?、俅罄ㄌ柾卣?。(通配(globbing))將對大括號中的文件名做擴展。在大括號中,不允許有空白,除非這個空白被引用或轉義。第一種:對大括號中的以逗號分割的文件列表進行拓展。如 touch {a,b}.txt 結果為a.txt b.txt。第二種:對大括號中以點點(..)分割的順序文件列表起拓展作用,如:touch {a..d}.txt 結果為a.txt b.txt c.txt d.txt

# ls {ex1,ex2}.sh ex1.sh ex2.sh # ls {ex{1..3},ex4}.sh ex1.sh ex2.sh ex3.sh ex4.sh # ls {ex[1-3],ex4}.sh ex1.sh ex2.sh ex3.sh ex4.sh

  ②代碼塊,又被稱為內部組,這個結構事實上創建了一個匿名函數 。與小括號中的命令不同,大括號內的命令不會新開一個子shell運行,即腳本余下部分仍可使用括號內變量。括號內的命令間用分號隔開,最后一個也必須有分號。{}的第一個命令和左括號之間必須要有一個空格。

2、幾種特殊的替換結構

${var:-string},${var:+string},${var:=string},${var:?string}

 ?、?code>${var:-string}和${var:=string}:若變量var為空,則用在命令行中用string來替換${var:-string},否則變量var不為空時,則用變量var的值來替換${var:-string};對于${var:=string}的替換規則和${var:-string}是一樣的,所不同之處是${var:=string}若var為空時,用string替換${var:=string}的同時,把string賦給變量var: ${var:=string}很常用的一種用法是,判斷某個變量是否賦值,沒有的話則給它賦上一個默認值。

 ?、?${var:+string}的替換規則和上面的相反,即只有當var不是空的時候才替換成string,若var為空時則不替換或者說是替換成變量 var的值,即空值。(因為變量var此時為空,所以這兩種說法是等價的)

 ?、?code>${var:?string}替換規則為:若變量var不為空,則用變量var的值來替換${var:?string};若變量var為空,則把string輸出到標準錯誤中,并從腳本中退出。我們可利用此特性來檢查是否設置了變量的值。

  補充擴展:在上面這五種替換結構中string不一定是常值的,可用另外一個變量的值或是一種命令的輸出。

3、四種模式匹配替換結構

模式匹配記憶方法:

# 是去掉左邊(在鍵盤上#在$之左邊)
% 是去掉右邊(在鍵盤上%在$之右邊)
#和%中的單一符號是最小匹配,兩個相同符號是最大匹配。

${var%pattern},${var%%pattern},${var#pattern},${var##pattern}

  第一種模式:${variable%pattern},這種模式時,shell在variable中查找,看它是否一給的模式pattern結尾,如果是,就從命令行把variable中的內容去掉右邊最短的匹配模式

  第二種模式: ${variable%%pattern},這種模式時,shell在variable中查找,看它是否一給的模式pattern結尾,如果是,就從命令行把variable中的內容去掉右邊最長的匹配模式

  第三種模式:${variable#pattern} 這種模式時,shell在variable中查找,看它是否一給的模式pattern開始,如果是,就從命令行把variable中的內容去掉左邊最短的匹配模式

  第四種模式: ${variable##pattern} 這種模式時,shell在variable中查找,看它是否一給的模式pattern結尾,如果是,就從命令行把variable中的內容去掉右邊最長的匹配模式

  這四種模式中都不會改變variable的值,其中,只有在pattern中使用了*匹配符號時,%和%%,#和##才有區別。結構中的pattern支持通配符,*表示零個或多個任意字符,?表示僅與一個任意字符匹配,[...]表示匹配中括號里面的字符,[!...]表示不匹配中括號里面的字符。

# var=testcase # echo $var testcase # echo ${var%s*e} testca # echo $var testcase # echo ${var%%s*e} te # echo ${var#?e} stcase # echo ${var##?e} stcase # echo ${var##*e}# echo ${var##*s} e # echo ${var##test} case

4、字符串提取和替換

${var:num},${var:num1:num2},${var/pattern/pattern},${var//pattern/pattern}

  第一種模式:${var:num},這種模式時,shell在var中提取第num個字符到末尾的所有字符。若num為正數,從左邊0處開始;若num為負數,從右邊開始提取字串,但必須使用在冒號后面加空格或一個數字或整個num加上括號,如${var: -2}、${var:1-3}或${var:(-2)}。

  第二種模式:${var:num1:num2},num1是位置,num2是長度。表示從$var字符串的第$num1個位置開始提取長度為$num2的子串。不能為負數。

  第三種模式:${var/pattern/pattern}表示將var字符串的第一個匹配的pattern替換為另一個pattern。

  第四種模式:${var//pattern/pattern}表示將var字符串中的所有能匹配的pattern替換為另一個pattern。

[root@centos ~]# var=/home/centos [root@centos ~]# echo $var /home/centos [root@centos ~]# echo ${var:5} /centos [root@centos ~]# echo ${var: -6} centos [root@centos ~]# echo ${var:(-6)} centos [root@centos ~]# echo ${var:1:4} home [root@centos ~]# echo ${var/o/h} /hhme/centos [root@centos ~]# echo ${var//o/h} /hhme/cenths

四、符號$后的括號

(1)${a} 變量a的值, 在不引起歧義的情況下可以省略大括號。

(2)$(cmd) 命令替換,和`cmd`效果相同,結果為shell命令cmd的輸,過某些Shell版本不支持$()形式的命令替換, 如tcsh。

(3)$((expression)) 和`exprexpression`效果相同, 計算數學表達式exp的數值, 其中exp只要符合C語言的運算規則即可, 甚至三目運算符和邏輯表達式都可以計算。

五、使用

1、多條命令執行

(1)單小括號,(cmd1;cmd2;cmd3) 新開一個子shell順序執行命令cmd1,cmd2,cmd3, 各命令之間用分號隔開, 最后一個命令后可以沒有分號。

(2)單大括號,{ cmd1;cmd2;cmd3;} 在當前shell順序執行命令cmd1,cmd2,cmd3, 各命令之間用分號隔開, 最后一個命令后必須有分號, 第一條命令和左括號之間必須用空格隔開。

對{}和()而言, 括號中的重定向符只影響該條命令, 而括號外的重定向符影響到括號中的所有命令。

總結

以上所述是小編給大家介紹的shell中各種括號的作用()、(())、[]、[[]]、{}(推薦),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区中文字幕| 欧美黑人xxx| 精品久久久久久电影| 日韩大片在线观看视频| 国产欧美一区二区三区四区| 亚洲男女性事视频| 91精品国产高清久久久久久91| 91在线网站视频| 亚洲已满18点击进入在线看片| 午夜精品一区二区三区在线播放| 欧美视频在线免费| 91深夜福利视频| 日本成人黄色片| 国产精品扒开腿爽爽爽视频| 久久99精品久久久久久噜噜| 亚洲性线免费观看视频成熟| 97精品在线观看| 欧美成人精品激情在线观看| 欧美成人免费视频| 亚洲欧美日韩直播| 国产精品人人做人人爽| 日韩成人黄色av| 亚洲欧美日韩精品久久奇米色影视| 亚洲精品欧美日韩| 国产女人18毛片水18精品| 色哟哟入口国产精品| 亚洲午夜未满十八勿入免费观看全集| 久久婷婷国产麻豆91天堂| 欧美一级电影免费在线观看| 97国产精品视频人人做人人爱| 国产精品久久久久久久久免费看| 伊人青青综合网站| 久久精品最新地址| 青青草国产精品一区二区| 日韩中文字幕网址| 成人欧美一区二区三区黑人| 国产精品久久久久久久久久久久久| 欧美日韩视频免费播放| 日韩国产在线看| 国产亚洲欧洲黄色| 久久久精品视频成人| 成人在线视频网站| 在线观看视频亚洲| 成人国产精品免费视频| 精品香蕉在线观看视频一| 国产精品免费小视频| 亚洲成av人片在线观看香蕉| 日韩精品视频在线| 九九综合九九综合| …久久精品99久久香蕉国产| 亚洲成人久久电影| 亚洲人午夜色婷婷| 色综合老司机第九色激情| 久久久精品国产| 亚洲国产精品va| 91精品久久久久久久久不口人| 亚洲欧美日韩一区二区在线| 精品国产成人在线| 亚洲第一精品夜夜躁人人爽| 狠狠躁夜夜躁人人爽超碰91| 久久91超碰青草是什么| 亚洲黄色在线观看| 久久久久久久久久久久久久久久久久av| 国产精品激情av电影在线观看| 久久久999精品| 国产精品激情自拍| 亚洲美女www午夜| 国产精品久久久久av| 国产日韩在线视频| 欧美午夜精品久久久久久浪潮| 欧美日韩高清在线观看| 91美女片黄在线观看游戏| 91精品国产综合久久久久久久久| 国产精品高精视频免费| 亚洲精品一区二区网址| 亚洲欧美日韩天堂一区二区| 538国产精品一区二区在线| 欧美激情视频给我| 国产日韩一区在线| 欧美肥老妇视频| 国产一区二区日韩| 亚洲18私人小影院| 欧美电影免费观看电视剧大全| 日韩一级黄色av| 亚洲变态欧美另类捆绑| 欧美裸体xxxx极品少妇软件| 成人黄色生活片| 久久成人这里只有精品| 91在线免费观看网站| 亚洲二区在线播放视频| 国产精品久久久久久久av电影| 国产91久久婷婷一区二区| 欧美日韩在线免费观看| 欧美一区二区大胆人体摄影专业网站| 日韩视频免费看| 91免费视频网站| 欧美三级免费观看| 日韩高清av在线| 色中色综合影院手机版在线观看| 亚洲精品欧美一区二区三区| 欧美日韩一区免费| 亚洲国产精彩中文乱码av| 琪琪亚洲精品午夜在线| 成人乱色短篇合集| 97av在线影院| 91精品国产高清自在线看超| 欧美一级淫片丝袜脚交| 日韩69视频在线观看| 日产精品久久久一区二区福利| 国产亚洲一区精品| 成人精品一区二区三区电影免费| 一区二区三区 在线观看视| 精品女厕一区二区三区| 欧美小视频在线| 欧美高清一级大片| 国产一区二区三区在线播放免费观看| 国产精品h片在线播放| 久久久亚洲天堂| 亚洲免费高清视频| 亚洲欧美日韩一区二区三区在线| 最新亚洲国产精品| 清纯唯美亚洲综合| 超碰精品一区二区三区乱码| 精品动漫一区二区三区| 欧美精品日韩www.p站| 最新国产成人av网站网址麻豆| 国产日韩欧美夫妻视频在线观看| 久热精品在线视频| 欧美二区乱c黑人| 欧美丰满老妇厨房牲生活| 欧美夜福利tv在线| 国产福利视频一区| 亚洲电影在线观看| 国产一区二中文字幕在线看| 欧美老女人性视频| 欧美人成在线视频| 国产亚洲人成网站在线观看| 国产精品香蕉在线观看| 久久好看免费视频| 亚洲视频电影图片偷拍一区| 国产va免费精品高清在线| 九九精品在线观看| 欧美另类老肥妇| 亚洲美女性视频| 久久精品亚洲94久久精品| 国产97在线亚洲| 国产精品嫩草影院一区二区| 亚洲天堂男人的天堂| 在线观看欧美日韩国产| 欧美性猛交xxxx黑人| 久久久久免费视频| 国产欧美日韩精品专区| 国产精品欧美激情在线播放| 日韩电影中文字幕在线观看| 欧美性理论片在线观看片免费| 91经典在线视频| 色老头一区二区三区在线观看| 欧美亚洲伦理www| 亚洲一区二区三区视频| 国产精品激情av电影在线观看| 亚洲国产成人在线播放| 日韩大片在线观看视频| 综合av色偷偷网| 久久精品视频va|