Linux shell程序設(shè)計(jì)(二).特殊字符
?
??? Linux中的特殊字符還是很多的,這部分需要一些記憶。當(dāng)然如果用得熟練了之后,就很自然了。畢竟大多數(shù)的正則式的表達(dá)形式都是相差無(wú)幾的。但是在shell里有一些比較特殊的用法,下面看一下詳細(xì):
?
?
一、通配符
?
1、一般通配符
?
??? ① * (星號(hào)):匹配字符的0次或多次出現(xiàn)
?
??? 舉例:f*可以匹配f、fa、fls.a
??? 注意:“.”和“/”必須顯示匹配
???????? *file無(wú)法匹配.file,必須用.*file
???????? /etc*.c無(wú)法匹配/etc/a.c,必須用/etc/*.c
?
??? ② ? (問(wèn)號(hào)):匹配任意一個(gè)字符
?
??? 舉例:f?可以匹配fa、f3,但不能匹配f、fa2
?
??? ③ [] (一對(duì)括號(hào)):匹配括號(hào)內(nèi)的字符組
?
??? 舉例:f[abc]可匹配fa、fb、fc
??? 注意:可以用“-”來(lái)表示范圍,即f[a-c]和上面的例子是一樣的
???????? 另外*和?在[]里面將不再表示通配符,而僅為普通字符
?
??? ④ ! (驚嘆號(hào)):緊跟在[后面,表示不再該范圍內(nèi)
?
??? 舉例:f[!1-9].c用以匹配f后面不是1-9的.c文件,即可以是fa.c
??? 注意:[]也僅匹配一個(gè)字符,即不可能是其中的2個(gè)或2個(gè)以上
?
2、模式表達(dá)式
?
??? ① *(模式表):匹配給定表模式0次或多次出現(xiàn)
?
??? 舉例:file*(.c
| .o)將匹配file、file.c、file.o、file.c.c、file.o.c等
?
??? ② +(模式表):匹配給定表模式1次或多次出現(xiàn)
?
??? 舉例:file+(.c | .o)將匹配file.c、file.o、file.c.c、file.o.c等,不匹配file
?
??? ③ ?(模式表):匹配給定表任何模式的0次或1次出現(xiàn)
?
??? 舉例:file?(.c | .o)只匹配file、file.c、file.o,不匹配file.c.c、file.c.o
?
??? ④ @(模式表):僅匹配給定表模式1次
出現(xiàn)
?
??? 舉例:file@(.c | .o)只匹配file.c、file.o
?
??? ⑤ !(模式表):出給定表中的一個(gè)模式之外,可以匹配任何東西
?
?
?
二、引號(hào)
?
?
1、雙引號(hào)
?
??? 雙引號(hào)可以將除了“$”、“`”、“\”外的所有內(nèi)容作為普通字符處理,
三個(gè)例外仍保留特殊功能
?
??? “$”:表示變量替換
??? “`”:倒引號(hào),表示命令替換
??? “\”:轉(zhuǎn)義符,告訴shell不要對(duì)$、`、"、\或換行符進(jìn)行特殊處理
?
??? 舉例:
??? $ echo "current directory is `pwd`"? --current directory is /home/wxq/prog
??? $ echo "home directory is $HOME"? --home directory is /home/wxq
??? $ echo "file*.?"? --file*.?
??? $ echo "home directory is \$HOME"? --home directory is $HOME
??? $ echo "directory '$HOME'"? --directory /home/wxq
?
2、單引號(hào)
?
??? 單引號(hào)中的任何字符均作為普通字符,例如:
??? $ echo 'echo "directory is $HOME"'? --echo "directory is $HOME"
?
3、倒引號(hào)
?
??? 倒引號(hào)括起來(lái)的字符串被shell解釋為命令,用運(yùn)行命令后的返回信息代替這個(gè)引號(hào)內(nèi)容。
?
??? 舉例
??? $ today=`date`
??? $ echo Today is $today
??? --Today is Fri Feb 20 08:59:01 CST 2009
?
??? $ Nuser=`echo The number of users is \`who|wc -l\``
??? $ echo $Nuser
??? --The number of users is 1
?
?
三、輸入/輸出重定向
?
1、輸入重定向符
?
??? “<”:將命令的標(biāo)準(zhǔn)輸入重新定向到指定文件,例如:
??? $ bash < file1
??? 即將file1中的所有語(yǔ)句使用bash命令全部重新執(zhí)行一遍
?
2、輸出重定向符
?
??? “>”:將命令的標(biāo)準(zhǔn)輸出重定向到指定文件,例如:
??? $ date > abc
??? 這樣屏幕上不再顯示date命令的結(jié)果,而全部保存到文件abc中
??? $ ex2 > abc
??? shell腳本的執(zhí)行結(jié)果也可以輸出到文件abc中
?
??? 注:不但可以輸出到普通文件,還可以對(duì)應(yīng)I/O設(shè)備,例如:
??????? $ cat f1.c > /dev/lp0? --在并行打印機(jī)上打印
?
3、輸出附加定向符
?
??? “>>”:將輸出內(nèi)容附加到原來(lái)文件的后面,不破壞原來(lái)的內(nèi)容。例如:
??? $ ps -l >> psfile
?
4、即時(shí)文件定向符
?
??? “<<”:將輸入行重新定向到一個(gè)命令中,例如:
??? $ bash << %%
??? ls
??? date
??? %%
???
??? 注:必須以一對(duì)標(biāo)記符來(lái)標(biāo)注輸入的內(nèi)容,如上例中為%%
?
5、與文件描述字有關(guān)的重定向
?
??? “n>”“n>>”:將特定類型的文字描述輸出到文件中,例如:
??? $ gcc m1.c 2 > errfile
??? 表示將對(duì)m1.c的編譯過(guò)程中產(chǎn)生的錯(cuò)誤放入文件errfile中
?
??? 注:0代表輸入、1代表輸出、2代表錯(cuò)誤輸出,另外還有3-9
?
??? 另注:輸入輸出定相符可以同時(shí)使用,如: $ wc -l < infile > outfile
?
?
四、注釋、管道線和后臺(tái)命令
?
1、注釋
?
??? “#”:以#開(kāi)頭的正文行表示注釋
?
??? 注:如果腳本第一行以#!開(kāi)頭,則后面接所使用shell的絕對(duì)路徑
?
2、管道線(過(guò)濾器)
?
??? “|”:表示前一個(gè)命令的輸出正好是后一個(gè)命令的輸入,例如:
??? $ ls -l | wc -l
?
??? ls輸出所有當(dāng)前路徑下文件夾及文件名稱,再由wc命令統(tǒng)計(jì)行數(shù)
?
3、后臺(tái)命令
?
??? “&”:在每條命令最后加上&,表示該命令為后臺(tái)命令,例如:
??? $ gcc m1.c&
?
??? 注:后臺(tái)執(zhí)行的意義在于,后臺(tái)程序僅在CPU有空閑時(shí)執(zhí)行,可以提高系統(tǒng)效率
?
?
五、命令執(zhí)行操作符
?
1、順序執(zhí)行
?
??? “;”:在同一行中使用分號(hào)將各個(gè)命令隔開(kāi),表示順序執(zhí)行,例如:
??? $ pwd; who |wc -l; cd /usr/bin
?
??? 注:執(zhí)行時(shí)從左至右,前面命令成功與否不影響后面
?
2、邏輯與
?
??? “&&”:把兩個(gè)命令連載一起,若前面的成功則執(zhí)行后面的,例如:
??? $ cp aaa bbb && rm aaa
?
??? 注:&&可以把多個(gè)命令都連起來(lái),但是只要只要中間任何一個(gè)未執(zhí)行成功,后面的就均不執(zhí)行
?
3、邏輯或
?
??? “||”:如果前面的不成功,則執(zhí)行后面的,例如:
??? $ cat aaa || pwd? --如果不能把a(bǔ)bc內(nèi)容列出,則顯示當(dāng)前目錄路徑
?
??? 注:||也可以連接多個(gè)命令,且與&&優(yōu)先級(jí)相同,但都低于|和&
?
?
六、成組數(shù)據(jù)
?
1、{ }形式
?
??? 以{}括起來(lái)的全部命令視為一條命令,出現(xiàn)在管道的一邊。例如:
??? $ { echo "User Report for `date`."; who;} | pr
?
??? 上例的作用就是可以將echo和who兩個(gè)命令的結(jié)果,一起傳輸給pr
?
??? 注意:{后面必須要有一個(gè)空格,}前必須要有分號(hào),另外{}內(nèi)的內(nèi)容可以多行。
?
2、( )形式
?
??? ()可以完成與{}一樣的效果,而且無(wú)需加空格和分號(hào)
?
??? 注:()和{}有本質(zhì)的區(qū)別是:()會(huì)生成新的子shell進(jìn)程,而不會(huì)改變父shell的變量值及工作目錄
?
??? $ a="current values";export a
??? $ echo $a
??? current values
??? $ (a="new value-1";echo $a)
??? new value-1
??? $ echo $a
??? current values
??? $ { a="new value-2";echo $a;}
??? new value-2
??? $ echo $a
??? new value-2
??? $ pwd
??? /opt/test
??? $ (cd /bin;pwd)
??? /bin
??? $ pwd
??? /opt/test
??? $ { cd /bin;pwd;}
??? /bin
??? $ pwd
??? /bin