shell中的大括弧,小括弧文法分別概述

來源:互聯網
上載者:User

shell中的大括弧,小括弧文法分別概述 1.shell中的大括弧和小括弧 1.${var}2.$(cmd)3.() 和 {}4.${var:-string}, ${var:+string}, ${var:=string}, ${var:?string}5.$((exp))6.$(var%pattern), $(var%%pattern), $(var#pattern), $(var##pattern) 現在分述如下:1.${var}是shell中的原形變數,我們常見的形式是$var如:$ var=test$ echo $vartest但是這樣不能在變數後隨意添加字元如:$varAA就會出錯這時,可以用原形${var}AAtestAA這個特性可以利用來批量修該尾碼名檔案為:rename.sh#! /bin/bashextension=$1for filename in `find . -type f`domv $filename ${filename}.$extensiondone使用 $ ./rename.sh c可把全部檔案修改為.c檔案  2.$(cmd)是命令替換如:$ ls d e f$ echo $(ls)d e f這個應該這樣理解,先是執行$(ls),這個的標準輸出來替換$(ls)的位置,作為echo  的參數,即echo d e f註:這個和``這個是一致的,看個人習慣了有一點是只有標準輸出才能被替換,錯誤輸出不能被替換  3.() 和 {}這兩個都是對一串命令的執行,但有些區別1.()只是對一串命令重新開一個子進程進行執行 {}是在當前進程執行2.()和{}內的命令都是以;隔開 ()最後一個命令可以不用分號; {}最後一個分號需要3.()第一個命令不需要和括弧間有空格 {}第一個命令和左邊的括弧間有空格 對於1:$ var=10$ (var=20;echo $var)20$ echo $var10說明()中執行的語句沒有調用當前的變數,所以是在子進程中實現  $ var=30$ { var=40;echo $var } #第一個要有空格哦40$ echo $var40說明var被修改了,是在同一個進程中實現  4.${var:-string}, ${var:+string}, ${var:=string}, ${var:?string} A,${var:-string}和${var:=string}若變數var為空白,則用在命令列中用string來替換${var:-string},否則變數var不為空白時,則用變數var的值來替換${var:-string}如:$ echo newvar$ echo ${newvar:-a}a$ echo newvar ###變數newvar的值仍然是空,但上一命令列中${newvar:-a}被替換成了a$ newvar=b$ echo ${newvar:-a} ###變數newvar的值不為空白時,此命令列中的${newvar:-b}被替換為$newvar,即bb$對於${var:=string}的替換規則和${var:-string}是一樣的,所不同之處是${var:=string}若var為空白時,用string替換${var:=string}的同時,把string賦給變數var:  $ echo newvar$ echo ${newvar:=a}a$ echo newvar ###變數newvar被賦值為a,同時${newvar:=a}被替換成aa$ echo ${newvar:=b} ###變數newvar不為空白(其值已被賦為a),則${newvar:=b}被替換為newvar的值(即b)a$ echo $newvara${var:=string}很常用的一種用法是,判斷某個變數是否賦值,沒有的話則給它賦上一個預設值。如設定預設的編輯器:PHP 代碼:echo You use editor: ${EDITOR:=/bin/vi}B,${var:+string}${var:+string}的替換規則和上面的相反,即只有當var不是空的時候才替換成string,若var為空白時則不替換或者說是替換成變數 var的值,即空值。(因為變數var此時為空白,所以這兩種說法是等價的)$ echo $newvara$ echo ${newvar:+b}b$ echo $newvara$ newvar=$ echo ${newvar:+b}$C,${var:?string}替換規則為:若變數var不為空白,則用變數var的值來替換${var:?string};若變數var為空白,則把string輸出到標準錯誤中,並從指令碼中退出。我們可利用此特性來檢查是否設定了變數的值。$ newvar=$ echo ${newvar:?沒有設定newvar的值}bash: newvar: 沒有設定newvar的值$ newvar=a$ echo ${newvar:?沒有設定newvar的值}a$補充擴充:在上面這五種替換結構中string不一定是常值的,可用另外一個變數的值或是一種命令的輸出。$ echo ${var:-`date`}日 3月 6 02:10:39 CST 2005$ echo ${var:-$(date)}日 3月 6 02:11:46 CST 2005$ a=test$ echo ${var:-$a}test$5.POSIX標準的擴充計算:$((exp))這種計算是符合C語言的運算子,也就是說只要符合C的運算子都可用在$((exp)),甚至是三目運算子。注意:這種擴充計算是整數型的計算,不支援浮點型.若是邏輯判斷,運算式exp為真則為1,假則為0。$ echo $((3+2))5$ echo $((3>2))1$ echo $((25<3 ? 2:3))3$ echo $var$ echo $((var=2+3))5$ echo $var5$ echo $((var++))5$ echo $var6$好了,上面的例子足夠了,這也表明了這種擴充運算是很強大的。6.四種模式比對替換結構:${var%pattern},${var%%pattern},${var#pattern},${var##pattern}這四種結構的意義是:${var%pattern}和${var%%pattern}表示從最右邊(即結尾)匹配的,${var#pattern} 和${var##pattern}從最左邊(即開頭)匹配的。其中${var%pattern}和${var#pattern}是最短匹 配,${var%%pattern}和${var##pattern}是最長相符。只有在pattern中使用了萬用字元才能有最長最短的匹配,否則沒有最 長最短匹配之分。結構中的pattern支援萬用字元,*表示零個或多個任一字元,?表示零個或一個任一字元,[...]表示匹配中括弧裡面的字元,[!...]表示不匹配中括弧裡面的字元。$ var=aabbbccbbdbb$ echo ${var%b}aabbbccbbdb$ echo ${var%%b}aabbbccbbdb$ echo ${var#a}abbbccbbdbb$ echo ${var##a}abbbccbbdbb$ echo ${var%*b}aabbbccbbdb$ echo ${var%%*b}$ echo ${var#a*}abbbccbbdbb$ echo ${var##a*}$

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.