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)
現(xiàn)在分述如下:
1.${var}是shell中的原形變量,我們常見的形式是
$var
如:
$ var=test
$ echo $var
test
但是這樣不能在變量后隨意添加字符
如:
$varAA
就會出錯(cuò)
這時(shí),可以用原形${var}AA
testAA
這個(gè)特性可以利用來批量修該后綴名
文件為:rename.sh
#! /bin/bash
extension=$1
for filename in `find . -type f`
do
mv $filename ${filename}.$extension
done
使用 $ ./rename.sh c可把全部文件修改為.c文件
2.$(cmd)是命令替換
如:
$ ls
d e f
$ echo $(ls)
d e f
這個(gè)應(yīng)該這樣理解,先是執(zhí)行$(ls),這個(gè)的標(biāo)準(zhǔn)輸出來
替換$(ls)的位置,作為echo 的參數(shù),即echo d e f
注:這個(gè)和``這個(gè)是一致的,看個(gè)人習(xí)慣了
有一點(diǎn)是只有標(biāo)準(zhǔn)輸出才能被替換,錯(cuò)誤輸出不能被替換
3.() 和 {}
這兩個(gè)都是對一串命令的執(zhí)行,但有些區(qū)別
1.()只是對一串命令重新開一個(gè)子進(jìn)程進(jìn)行執(zhí)行
{}是在當(dāng)前進(jìn)程執(zhí)行
2.()和{}內(nèi)的命令都是以;隔開
()最后一個(gè)命令可以不用分號;
{}最后一個(gè)分號需要
3.()第一個(gè)命令不需要和括號間有空格
{}第一個(gè)命令和左邊的括號間有空格
對于1:
$ var=10
$ (var=20;echo $var)
20
$ echo $var
10
說明()中執(zhí)行的語句沒有調(diào)用當(dāng)前的變量,所以是在子進(jìn)程中實(shí)現(xiàn)
$ var=30
$ { var=40;echo $var } #第一個(gè)要有空格哦
40
$ echo $var
40
說明var被修改了,是在同一個(gè)進(jìn)程中實(shí)現(xiàn)
4.${var:-string}, ${var:+string},
${var:=string}, ${var:?string}
A,${var:-string}和${var:=string}
若變量var為空,則用在命令行中用string來替換${var:-string},否則變量var不為空時(shí),則用變量var的值來替換${var:-string}
如:
$ echo newvar
$ echo ${newvar:-a}
a
$ echo newvar ###變量newvar的值仍然是空,但上一命令行中${newvar:-a}被替換成了a
$ newvar=b
$ echo ${newvar:-a} ###變量newvar的值不為空時(shí),此命令行中的${newvar:-b}被替換為$newvar,即b
b
$
對于${var:=string}的替換規(guī)則和${var:-string}是一樣的,所不同之處是${var:=string}若var為空時(shí),用string替換${var:=string}的同時(shí),把string賦給變量var:
$ echo newvar
$ echo ${newvar:=a}
a
$ echo newvar ###變量newvar被賦值為a,同時(shí)${newvar:=a}被替換成a
a
$ echo ${newvar:=b} ###變量newvar不為空(其值已被賦為a),則${newvar:=b}被替換為newvar的值(即b)
a
$ echo $newvar
a
${var:=string}很常用的一種用法是,判斷某個(gè)變量是否賦值,沒有的話則給它賦上一個(gè)默認(rèn)值,
shell中的大括號,小括號語法分別概述
,電腦資料
《shell中的大括號,小括號語法分別概述》(http://www.ishadingyu.com)。如設(shè)置默認(rèn)的編輯器:
PHP 代碼:
echo You use editor: ${EDITOR:=/bin/vi}
B,${var:+string}
${var:+string}的替換規(guī)則和上面的相反,即只有當(dāng)var不是空的時(shí)候才替換成string,若var為空時(shí)則不替換或者說是替換成變量 var的值,即空值。(因?yàn)樽兞縱ar此時(shí)為空,所以這兩種說法是等價(jià)的)
$ echo $newvar
a
$ echo ${newvar:+b}
b
$ echo $newvar
a
$ newvar=
$ echo ${newvar:+b}
$
C,${var:?string}
替換規(guī)則為:若變量var不為空,則用變量var的值來替換${var:?string};若變量var為空,則把string輸出到標(biāo)準(zhǔn)錯(cuò)誤中,并從腳本中退出。我們可利用此特性來檢查是否設(shè)置了變量的值。
$ newvar=
$ echo ${newvar:?沒有設(shè)置newvar的值}
bash: newvar: 沒有設(shè)置newvar的值
$ newvar=a
$ echo ${newvar:?沒有設(shè)置newvar的值}
a
$
補(bǔ)充擴(kuò)展:在上面這五種替換結(jié)構(gòu)中string不一定是常值的,可用另外一個(gè)變量的值或是一種命令的輸出。
$ 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標(biāo)準(zhǔn)的擴(kuò)展計(jì)算:$((exp))
這種計(jì)算是符合C語言的運(yùn)算符,也就是說只要符合C的運(yùn)算符都可用在$((exp)),甚至是三目運(yùn)算符。
注意:這種擴(kuò)展計(jì)算是整數(shù)型的計(jì)算,不支持浮點(diǎn)型.若是邏輯判斷,表達(dá)式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 $var
5
$ echo $((var++))
5
$ echo $var
6
$
好了,上面的例子足夠了,這也表明了這種擴(kuò)展運(yùn)算是很強(qiáng)大的。
6.四種模式匹配替換結(jié)構(gòu):${var%pattern},${var%%pattern},${var#pattern},${var##pattern}
這四種結(jié)構(gòu)的意義是:${var%pattern}和${var%%pattern}表示從最右邊(即結(jié)尾)匹配的,${var#pattern} 和${var##pattern}從最左邊(即開頭)匹配的。其中${var%pattern}和${var#pattern}是最短匹 配,${var%%pattern}和${var##pattern}是最長匹配。只有在pattern中使用了通配符才能有最長最短的匹配,否則沒有最 長最短匹配之分。
結(jié)構(gòu)中的pattern支持通配符,*表示零個(gè)或多個(gè)任意字符,?表示零個(gè)或一個(gè)任意字符,[...]表示匹配中括號里面的字符,[!...]表示不匹配中括號里面的字符。
$ 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*}
$