第4章 Linux shell程序設(shè)計 (8學(xué)時)_第1頁
第4章 Linux shell程序設(shè)計 (8學(xué)時)_第2頁
第4章 Linux shell程序設(shè)計 (8學(xué)時)_第3頁
第4章 Linux shell程序設(shè)計 (8學(xué)時)_第4頁
第4章 Linux shell程序設(shè)計 (8學(xué)時)_第5頁
已閱讀5頁,還剩109頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第4章Linuxshell程序設(shè)計

主要內(nèi)容

shell的主要特點、類型、建立和執(zhí)行的方式變量的分類、定義形式及引用規(guī)則各種控制語句的格式、功能及流程算術(shù)運算的使用函數(shù)的構(gòu)成及使用規(guī)則內(nèi)置命令4.1shell概述

4.1.2shell程序示例【例4.1】由三條簡單命令組成的shell程序(文件名為ex1)。$catex1datepwdcd..還有帶有控制結(jié)構(gòu)的shell程序,如if、for語句注意:PPT中凡是紅色代碼部分表示輸入的命令,綠色代碼表示輸出的結(jié)果4.1.3shell腳本的建立和執(zhí)行shell腳本的建立:利用編輯器錄入和編輯,如vi通常用戶不能直接執(zhí)行由文本編輯器建立的shell腳本,因為直接編輯生成的腳本文件沒有“執(zhí)行”權(quán)限,執(zhí)行shell腳本的三種方式:

(1)輸入定向到shell腳本:用輸入重定向方式讓shell從給定文件中讀入命令行,并進行相應(yīng)處理;

$bash<腳本名(紅旗版本Linux系統(tǒng)的默認shell是bash)

例如:$bash<ex1(4.5.3節(jié)會詳細講解輸入輸出重定向)

(2)以腳本名作為bash參數(shù)其一般形式是:$bash腳本名[參數(shù)]例:$bashex2/user/meng/usr/zhang

優(yōu)點:

可以在腳本名后面帶有參數(shù),從而將參數(shù)值傳遞給程序中的命令,使得一個shell腳本可以處理多種情況,可以用來進行程序調(diào)試;

(3)將shell腳本的權(quán)限設(shè)置為可執(zhí)行,然后在提示符下直接執(zhí)行它。要用chmod命令將其設(shè)置為有“執(zhí)行”權(quán)限

$chmoda+xex2$PATH=$PATH:.$ex2說明:第二行將當(dāng)前工作目錄(以“.”表示)添加到命令搜索路徑中;該腳本所在的目錄應(yīng)被包含在命令搜索路徑(PATH)中;其中$PATH表示引用變量的值;“:”是在PATH變量中,不同路徑之間的分隔符;【例4.1】4.2命令歷史

4.2.1顯示歷史命令bash提供了命令歷史的功能,即:系統(tǒng)為每個用戶維護一個命令歷史文件,其默認目錄是“~/.bash_history”;其中“~”表示注冊用戶的主目錄;作用便于調(diào)用、修改和快捷執(zhí)行命令,把全部或部分先前命令作為新命令,予以快捷執(zhí)行。語法格式是:history[option][arg…]

常用的選項有:

-a在歷史文件中添加“新”歷史命令行。

-n從歷史文件中讀取尚未讀入的歷史命令行,添加到當(dāng)前歷史清單中。

-r讀取歷史文件的內(nèi)容,并把它作為當(dāng)前的歷史命令。

-w把當(dāng)前的歷史寫到歷史文件中,覆蓋原有內(nèi)容。

-c刪除歷史清單中所有的項。如果不帶任何參數(shù),則history命令會顯示歷史命令的清單如果history后給出一個正整數(shù)(如50),就只顯示歷史表中的最后50行命令如果history后給出一個文件名,就把它作為歷史文件名4.2.2執(zhí)行歷史命令執(zhí)行歷史命令是命令替換之一,它以字符“!”開頭、后隨1個或多個字符,用來定義用戶所需的某種類型的歷史命令,例:P87

基本的事件指定字格式

格式

意義!!重復(fù)上一條命令,也就是“!-1”

!n重新執(zhí)行第n條歷史命令!-n重新執(zhí)行倒數(shù)第n條歷史命令。!-1就等于!!!string重新執(zhí)行以字符串string開頭的最近的歷史命令行。!?string?重新執(zhí)行最近的、包含字符串string的那條歷史命令!#到現(xiàn)在為止所輸入的整個命令行$date

一6月2621:35:18CST2006$pwd/home/mengqc$lsdesktopex1ex3exam15myfilem1$catm1echohello!$history1date2pwd3ls4catm15history$!2pwd/home/mengqc$!ccatm1echohello!$!?w?pwd/home/mengqc【例4.2】0-1.22’4.2.3用環(huán)境變量配置歷史命令環(huán)境在默認方式下,bash使用用戶主目錄下面的文件“.bash_history”來保存命令歷史注:以圓點“.”開頭的文件名是隱含文件,默認方式下,使用ls命令不能把它們顯示出來。用戶可以通過重新為環(huán)境變量賦值,改變存放歷史命令的文件

$HISTFILE="/home/mengqc/.myhistory"還可以重新設(shè)定能夠保留的命令個數(shù)

$HISTSIZE=6004.4別名

4.4.1定義別名一般語法格式為:alias[name[=value]]…如果沒有指定參數(shù),將在標準輸出(屏幕)上顯示別名清單定義別名時,往往用單引號將它代表的內(nèi)容括起來,從而防止shell對其中的內(nèi)容產(chǎn)生歧義,如:空格和特殊字符。優(yōu)點:可以簡化輸入,方便用戶,減少出錯率例:$alias

alias..=‘cd..’aliascp=‘cp-i’注意:等號兩邊不能有空格例:$aliasll=‘ls-l’$my=/home/mengqc

(定義變量并賦值)

$ll$my引用變量值要用單引號例:$aliasll=ls-l

bash:alias:‘-l’notfound$pwd

/home/mengqc$ll

m1lnm2ttt在此情況下,執(zhí)行l(wèi)l別名命令時,并不是執(zhí)行l(wèi)s–l,而是ls不用單引號的結(jié)果:【例4.3】假定/home/mengqc目錄下有m1,ln,m2,ttt四個文件4.4.2取消別名如果想取消先前定義的別名,可使用如下命令:

unaliasname…可以一次將所有的別名都從別名表中刪除,使用如下命令:

unalias-a

4.5shell特殊字符

4.5.1通配符1.一般通配符*(星號),它匹配任意字符的0次或多次出現(xiàn)?(問號),它匹配任意一個字符4.5.2引號1.雙引號由雙引號括起來的字符(除$、倒引號(`)和反斜線(\)外)均作為普通字符對待。2.單引號由單引號括起來的字符都作為普通字符出現(xiàn)3.倒引號`位于鍵盤的左上角倒引號括起來的字符串被shell解釋為命令行,先執(zhí)行該命令行,并以它的標準輸出結(jié)果取代整個倒引號部分。倒引號還可以嵌套使用。注意,嵌套使用時內(nèi)層的倒引號必須用反斜線(\)將其轉(zhuǎn)義。【例1】$catex3echo“currentdirectoryis`pwd`”echo“homedirectoryis$HOME”echo“file*.?”echo“directory‘$HOME’”$ex3currentdirectoryis/home/zhang/proghomedirectoryis/home/zhangfile*.?directory‘/home/zhang’此時單引號作為普通字符,而非特殊字符輸出是?【例2】$str=‘echo“directoryis$HOME”’$echo$strecho“directoryis$HOME”

整體都作為普通字符賦值給變量str$echo‘Thetimeis`date`,thefileis$HOME/abc’Thetimeis`date`,thefileis$HOME/abc

$echocurrentdirectoryis`pwd`currentdirectoryis/home/zhang

$today=`date`$echoTodayis$todayTodayis一6月2621:40:18CST2006

倒引號還可以嵌套使用。但應(yīng)注意,嵌套使用時內(nèi)層的倒引號必須用反斜線(\)將其轉(zhuǎn)義?!纠?】$usrnum=`echoThenumberofusersis\`who|wc-l\``$echo$usernum

Thenumberofusersis5此外,轉(zhuǎn)義字符(即反斜線\)能把特殊字符變成普通字符:輸出是?例:$echo“FilenameisNo\$\*”FilenameisNo$*

4.5.3輸入/輸出重定向符執(zhí)行一個shell命令時,通常自動打開三個標準文件,即1.標準輸入文件(stdin),通常對于鍵盤;

2.標準輸出文件(stdout);

3.標準出錯輸出文件(stderr),這兩個文件都對應(yīng)屏幕。在shell中,這三個文件都可以用重定向符進行重新定位1.輸入重定向符“<”

作用:把命令的標準輸入定向到指定的文件一般形式是:命令<

文件名經(jīng)常需要執(zhí)行的shell命令可以放進一個文件,并且讓shell從該文件讀取這些命令,例如:$catcmdsecho“yourworkingdirectoryis`pwd`”echo“yournameis`logname`”echo“thetimeis`date`”who$bash<cmdsShell命令解釋程序?qū)奈募mds中讀取命令,并加以執(zhí)行。2.輸出重定向符“>”作用:把命令的標準輸出重新定向到指定的文件一般形式是:命令>文件名如:$who>abc$catabc

who命令的輸出重定向到abc文件中,屏幕上看不到執(zhí)行who命令的結(jié)果,可以查看abc文件的內(nèi)容即可看到。此外,shell腳本文件的輸出也可以重定向到指定的文件,例如:注:執(zhí)行腳本文件后,才能把重定向的目標文件顯示出來,正是exp1文件的執(zhí)行結(jié)果;如果不同的輸出都重定向到同一文件,那么只有最后一次執(zhí)行的輸出保留在文件中,原有內(nèi)容被覆蓋。$catexp1echo“thetimeis`date`”echo“workingdirectoryis`pwd`”echo“ithas`ls–l|wc-l`files”

$exp1>tmp1$cattmp1【例4】輸出是?thetimeis一6月2621:43:00CST2006workingdirectoryis/home/mengqcithas26files

輸入和輸出重新定向可以連在一起使用。例如:

$wc-l<infile>outfile功能是:命令wc從文件infile中輸入信息,按“行”統(tǒng)計后的結(jié)果送到另一個文件outfile中,不在屏幕上顯示。3.輸出附加定向符“>>”把命令的標準輸出附加到指定文件的后面,原有內(nèi)容不變一般形式是:命令>>文件名如:$ps-l>>psfileps命令的輸出附加到psfile文件的結(jié)尾處。5.與文件描述字有關(guān)的重定向Linux系統(tǒng)中每個打開的文件,都由系統(tǒng)賦予的一個文件描述字,是個小整數(shù)。文件打開后,用戶可以直接用描述字來引用相應(yīng)的文件。系統(tǒng)為每個進程自動打開三個標準文件

標準輸入、標準輸出、錯誤輸出,其文件描述字分別為0,1和2。標準錯誤輸出也可重定向到一個文件中,其一般形式是:

命令2>文件名命令2>>文件名例:$gccm1.c2>errfile功能是:對C源文件m1.c進行編譯,并把編譯過程中產(chǎn)生的錯誤信息重定向到文件errfile中,其中數(shù)字2表示標準錯誤輸出的文件描述字。不能有空格4.5.4注釋、管道線和后臺命令1.注釋:以#開頭的正文行表示注釋

如果shell腳本中第一行是以“#!”開頭,則后面所跟的字符串就是所使用的shell的絕對路徑名。例如:對于Cshell腳本,第一行通常是:#!/bin/csh

對于bash腳本,第一行通常是:#!/bin/bash

這一行說明,該腳本是用哪一種shell編寫的,從而調(diào)用相應(yīng)的解釋程序予以執(zhí)行。

2.管道線管道線是由豎杠“|”隔開的若干個命令組成的序列,每個命令執(zhí)行時都有一個獨立的進程,前一個命令的輸出是下一個命令的輸入;管道線中有一類命令也成為“過濾器”,即:首先讀取輸入,然后將以某種簡單方式進行變換,相當(dāng)于過濾,再將處理結(jié)果輸出,如:grep,sort,wc等命令就是過濾器;一個管道線中可以包括多條命令:

ls-l$HOME|wc–lls|grepm*.c|wc–l顯示當(dāng)前目錄中文件名是以m開頭的C文件的數(shù)目該命令的功能是什么?3.后臺命令

前臺方式:命令提示符之后輸入,立即執(zhí)行后臺方式:可能有些程序的執(zhí)行需要花費較長時間,如:調(diào)用C編譯器對C程序進行編譯,如果在此同時想做別的事情,則要輸入:

$gccm1.c&即:

在一條命令后面輸入“&”,告訴shell該命令后臺運行,而shell馬上顯示提示符狀態(tài),可以輸入新命令。4.5.5命令執(zhí)行操作符多條命令可以在一行中出現(xiàn),它們可以順序執(zhí)行,也可能在相鄰的命令間存在邏輯關(guān)系,即:邏輯“與”和“或”1.順序執(zhí)行在執(zhí)行時,以分號隔開的各條命令從左到右依次執(zhí)行

pwd;who|wc-l;cd/usr/bin

等價于每條命令獨占一行

2.邏輯與&&一般格式:命令1&&命令2其功能是:先執(zhí)行命令1,如果執(zhí)行成功,才執(zhí)行命令2;否則,若命令1執(zhí)行不成功,則不執(zhí)行命令2。例:$cpex1ex10&&rmex1功能是?如果成功地把文件ex1復(fù)制到文件ex10中,則把ex1刪除。如果命令執(zhí)行成功,其返回值為0;否則返回非0值。3.邏輯或||一般格式為:命令1||命令2其功能是:先執(zhí)行命令1,如果執(zhí)行不成功,則執(zhí)行命令2;否則,若命令1執(zhí)行成功,則不執(zhí)行命令2。例:$catabc||pwd如果不能將文件abc的內(nèi)容列出來,則顯示當(dāng)前的工作目錄的絕對路徑。4.5.6成組命令Shell中有兩種方式可以將若干命令組合在一起,使其在邏輯上,被視為一條命令。組合命令方式有兩種:花括號{}和圓括號()1.{}形式以花括號括起來的全部命令可視為語法上的一條命令,出現(xiàn)在管道符的一邊。執(zhí)行順序:根據(jù)命令出現(xiàn)的先后順序,由左向右執(zhí)行;在管道線中,成組命令把各個命令的執(zhí)行結(jié)果匯集到一起,形成一個輸出流,作為管道線中下一個命令的輸入。

使用花括號時在格式上應(yīng)注意:

左括號“{”后面應(yīng)有一個空格;

右括號“}”之前應(yīng)有一個分號(;)${echo“UserReportfor`date`”;who;}|pr輸出:

2006-07-0117:58page1UserReportfor六7月117:58CST2006mengqctty02Jul115:01roottty01Jul115:06pr命令可以用來將文本轉(zhuǎn)換成適合打印的文件,一個基本用途就是將較大的文件分割成多個頁面,并為每個頁面添加標題。2.()形式

$(echo"Currentdirectoryis`pwd`"cd/home/mengqc;ls-l;cpm1em1&&rmm1;catem1)|pr

使用圓括號時在格式上:

左括號“(”后面不需空格;右括號“)”之前也不需加一個分號二者存在重要區(qū)別:用花括號括起來的成組命令只是在本shell內(nèi)執(zhí)行,不產(chǎn)生新的進程;而用圓括號括起來的成組命令要建立新的子進程,因此不會改變父shell的變量值和工作目錄等。$a=“currentvalue”;exporta$echo$a

currentvalue$(a=“newvalue-1”;echo$a)newvalue-1$echo$a

currentvalue【例】$a=“currentvalue”;exporta$echo$a

currentvalue${a=“newvalue-2”;echo$a;}newvalue-2$echo$a

newvalue-2$pwd

/home/mengqc$(cd/bin;pwd)/bin$pwd/home/mengqc$pwd/home/mengqc${cd/bin;pwd;}/bin$pwd/bin4.6shell變量Shell有兩類變量:環(huán)境變量和臨時變量。其中,環(huán)境變量永久性的變量,其值不會隨shell腳本執(zhí)行結(jié)束而消失;臨時變量在shell程序內(nèi)部定義,使用范圍僅限于定義它的程序,出了本程序之外不能再使用,當(dāng)程序執(zhí)行完畢,它的值也就不存在了。4.6.1用戶定義的變量

1.用戶定義的變量是最普通的shell變量,變量名是以字母或下線符打頭的字母、數(shù)字和下線符序列,且大小寫字母意義不同。

2.

變量賦值定義變量并賦值的一般形式是:變量名=字符串例如:myfile=/usr/meng/m1.c3.引用變量值:在變量名前面加上一個符號“$”

如果在賦給變量的值中要含有空格、制表符或換行符,那么,就應(yīng)該用雙引號把這個字符串括起來。

$names="ZhangsanLisiWangwu"變量名,區(qū)分大小寫!如果變量值須出現(xiàn)在長字符串的開頭或者中間,為了使變量名與其后的字符區(qū)分開,避免shell把它與其它字符混在一起視為一個新變量,則應(yīng)該用花括號將該變量名括起來。例如,

$dir=/usr/meng$cat${dir}qc/m1.c若輸入:$cat$dirqc/m1.c

則系統(tǒng)會提示出錯,因為它認為dirqc是個新變量,在前面沒有對它賦值,其值為空串,所以無法找到m1.c4.命令替換:將一個命令的執(zhí)行結(jié)果賦值給變量有兩種形式的命令替換:一種是使用倒引號引用命令,其一般形式是:

`命令`,如:$dir=`pwd`另一種形式是:

$(用分號隔開的命令)

如:$dir=$(pwd)$echo$(pwd;cd/home/mengqc;ls)4.6.2數(shù)組bash只提供一維數(shù)組,并且沒有限定數(shù)組的大小。類似C語言,數(shù)組元素的下標由0開始編號。對數(shù)組元素賦值的一般形式是:

數(shù)組名[下標]=值例如:$city[0]=Beijing$city[1]=Shanghai$city[2]=Wuhan1.可以用declare命令顯式聲明一個數(shù)組,一般形式是:

declare-a數(shù)組名讀取數(shù)組元素值的一般格式是:

${數(shù)組名[下標]}例如:$echo${city[0]}定義一個數(shù)組并為其賦初值的一般形式是:

數(shù)組名=(值1值2…

值n)其中,各個值之間以空格分開。例如:$A=(Thisisanexampleofshellscript)$echo${A[0]}${A[2]}${A[3]}${A[6]}2.若沒有給出數(shù)組元素的下標,則數(shù)組名表示下標為0的數(shù)組元素3.使用*或@當(dāng)作下標,則會以數(shù)組中所有元素取代[*]或[@]

$echo${A[*]}

Thisisanexampleofshellscript4.6.3變量引用除了上面所介紹的變量引用方式之外,在bash中還有其他的引用方式,歸納起來,有效的變量引用表達式有以下形式:$name${name#pattern}${name}${name##pattern}${name[n]}${name%pattern}${name[*]}${name%%pattern}${name[@]}${#@}${name:-word}${$#*}${name:=word}${#name}${name:?word}${#name[*]}${name:+word}${#name[@]}①表達式$name表示變量name的值,若變量未定義,則用空值替換。②表達式${name}將被變量name的值替換。用花括號括起name,目的在于把變量名與后面的字符分隔開,避免出現(xiàn)混淆。替換后花括號被取消。③${name[n]}表示數(shù)組變量name中第n個元素的值。分別介紹如下:④表達式${name[*]}和${name[@]}都表示數(shù)組name中所有非空元素的值,每個元素的值用空格分開。⑤表達式${name:-word}、${name:=word}、${name:+word}、${name:?word}的計算方法在4.7節(jié)中介紹⑥表達式${name#pattern}和${name##pattern}

如果pattern(Shell模式)與name值的開頭匹配,那么name的值去掉匹配部分后的結(jié)果就是該表達式的值;

否則,name的值就是該表達式的值。在第一種格式中,name值去掉的部分是與pattern匹配的最少的部分;而第二種格式中,name值去掉的部分是與pattern匹配的最多的部分。⑦表達式${name%pattern}和${name%%pattern}

如果pattern與name值的末尾匹配,那么name的值中去掉匹配部分后的結(jié)果就是該表達式的值;否則,該表達式的值就是name的值。在第一種格式中,去掉的部分是最少的匹配部分;而第二種格式中,去掉的部分是最多的匹配部分。⑧表達式${#@}和${#*}

它們的值分別是由$@和$*返回的參數(shù)的個數(shù)。⑨表達式${#name[i]}

該表達式的值是數(shù)組name第i個元素值的長度(字符個數(shù))。⑩表達式${#name[*]}和${#name[@]}

它們的值都是數(shù)組name中已經(jīng)設(shè)置的元素的個數(shù)。4.6.4輸入/輸出命令1.read命令可以利用read命令從鍵盤上讀取數(shù)據(jù),然后賦給指定的變量。read命令的一般格式是:

read變量1[變量2…]變量個數(shù)與給定數(shù)據(jù)個數(shù)相同,則依次對應(yīng)賦值變量個數(shù)少于數(shù)據(jù)個數(shù),則從左至右對應(yīng)賦值,但最后一個變量被賦予剩余的所有數(shù)據(jù)。變量個數(shù)多于給定數(shù)據(jù)個數(shù),則依次對應(yīng)賦值,而沒有數(shù)據(jù)與之對應(yīng)的變量取空串例:readnamereadabc利用該命令可以交互式地為變量賦值。輸入數(shù)據(jù)時,數(shù)據(jù)間以空格,或制表符作為分隔符。例:P1052.echo命令顯示其后的變量值或者直接顯示它后面的字符串

例:readnamereadabc利用該命令可以交互式地為變量賦值。輸入數(shù)據(jù)時,數(shù)據(jù)間以空格,或制表符作為分隔符。例:P105【例4.8】這是一個特洛伊木馬shell腳本示例。

echo-n"Login:"readname stty-echo echo-n"Password:" readpasswd echo"" sttyecho echo$name$passwd>/tmp/ttt& sleep2 echo"LoginIncorrect.Re-enter,Please." sttycooked關(guān)閉屏幕響應(yīng)重新打開屏幕響應(yīng)4.6.5位置參數(shù)1.位置參數(shù)及其引用位置變量的名稱很特別,分別是0,1,2,…

與命令行上具體位置上的實參相對應(yīng)。如果位置變量包括兩個或多個數(shù)字,則要用{}

引用它們的方式依次是$0,$1,$2,…,$9,${10}等。其中,$0始終表示命令名或shell腳本名?!恢米兞坎荒芡ㄟ^一般賦值的方式直接賦值▲通過命令行上對應(yīng)位置的實參傳值命令行實參與腳本中位置變量的對應(yīng)關(guān)系如下所示:

exam1m1m2m3m4$0$1$2$3$4【例】$catm1.c

main(){printf(“Begin\n”);}$catm2.c

#!/bin/bashmain(){printf(“End\n”);}$catex6

#ex5:shellscripttocombinefilesandcountcat$1$2$3$4$5$6$7$8$9|wc-l#end$ex6m1.cm2.c9catm1.cm2.c|wc-l提問:1、$1,$2,…,$9的值分別為?2、最后一行命令等價于執(zhí)行?3、最終輸出為?2.用set命令為位置參數(shù)賦值例:setm1.cm2.cm3.c把字符串m1.c賦值給$1;m2.c賦值給$2;m3.c賦值給$3但是$0不能用set命令賦值,它的值總是命令名$catex7

#!/bin/bash#testsetm1.cm2.ccat$1$2$3|wc–l#end$ex7

9【例】4.6.6移動位置參數(shù)

每執(zhí)行一次shift命令,就把命令行上的實參向左移一位,即相當(dāng)于位置參數(shù)向右移動一個位置。

命令行:ex7ABCDEF原位置參數(shù):$0$1$2$3$4$5$6

移位后:$0 $1$2$3$4$5注意:shift命令不能將$0移走,所以經(jīng)shift右移位置參數(shù)后,$0的值不會發(fā)生變化。shift命令可以帶有一個整數(shù)作為參數(shù)【例】$catex8

#!/bin/bash#ex8:shellscripttodemonstratetheshiftcomandecho$0$1$2$3$4$5$6$7$8$9shiftecho$0$1$2$3$4$5$6$7$8$9shift4echo$0$1$2$3$4$5$6$7$8$9#end$ex8ABCDEFGHIJK

ex8ABCDEFGHIex8BCDEFGHIJex8FGHIJK輸出為?set命令$catexam14echo`date`set`date`echo$2$3$6echo$0$1$2$3$4$5$6$exam14SunDec216:10:00CST2001Dec22001exam14SunDec216:10:00CST2001用來設(shè)定位置參數(shù)的值;$0不能用set命令賦值,它的值總是命令名4.6.8環(huán)境變量用戶注冊過程中,系統(tǒng)需要做的一件事情就是建立用戶環(huán)境;Linux環(huán)境,也稱為shell環(huán)境,由許多變量以及這些變量的值組成;Shell環(huán)境包括:使用的shell類型、主目錄所在位置、正在使用的終端類型等等;許多變量是在注冊過程中定義的,一些為只讀類型,一些為非只讀類型,可以隨意增加或修改。1.常用的環(huán)境變量

HOME:用戶主目錄的全路徑名LOGNAME:即你的注冊名,由Linux自動設(shè)置

MAIL:你的系統(tǒng)信箱的路徑

PATH:shell從中查找命令的目錄列表??梢栽O(shè)置它,

如:PATH=$PATH:$HOME/binPS1:shell的主提示符。

bash默認的主提示符一般為“\s-\v\$”。其中,\s表示shell的名稱;\v表示bash的版本號??梢噪S意設(shè)置PS1的值,如:

PS1="EnterCommand>“

則:主提示符改成:”EnterCommand>”PWD:你當(dāng)前工作目錄的路徑

SHELL:你當(dāng)前使用的shellTERM:你的終端類型2.使用環(huán)境變量可以用echo命令查看任何一個環(huán)境變量的值,也可以在命令中將環(huán)境變量的值作為參數(shù)。如果要使用環(huán)境變量時,必須在變量名之前加上一個“$”符號,不能直接使用變量名。

例:$echo$SHELL

/bin/bash$cd$HOME

(作為命令的參數(shù))將當(dāng)前的工作目錄改為主目錄4.6.10export語句與環(huán)境設(shè)置1.export語句【例】$string=“Thisisanexample”$catexam1

echo“Thevalueofthisvariableis$string”$exam11Thevalueofthisvariableis$echo$stringThisisanexample在shell腳本exam1中,變量string的值為空串;而在命令提示符的環(huán)境下,變量string的值仍為第一個命令行定義的值;為什么會出現(xiàn)這類問題呢?這是由于shell腳本exam11的運行環(huán)境和前面變量string的定義環(huán)境不同。從上面的示例可以看出:通常在命令行上輸入的命令,都是由進程執(zhí)行的;父進程又可以創(chuàng)建子進程,子進程完成該命令的功能,然而子進程與父進程的環(huán)境往往不同;一個進程在自己的環(huán)境中定義的變量是局部變量,僅限于自身范圍,不能自動傳給其子進程。就是說,子進程只能繼承父進程的公用區(qū)和轉(zhuǎn)出區(qū)中的數(shù)據(jù),而每個進程的數(shù)據(jù)區(qū)和棧區(qū)是私有的,不能繼承。公用區(qū)export區(qū)私有區(qū)(數(shù)據(jù)區(qū)、棧區(qū))父進程公用區(qū)export區(qū)私有區(qū)(數(shù)據(jù)區(qū)、棧區(qū))子進程父進程和子進程之間的繼承關(guān)系為了使其后的各個子進程能繼承父進程中定義的變量,就必須用export(轉(zhuǎn)出)命令將這些變量送入進程轉(zhuǎn)出區(qū)。export命令的一般使用形式是:

export[變量名],同一個export命令行上可以有多個變量名?!纠?.12】$major=“computerscience”$exportmajor$catexam12

major=“English”echo“Hismajoris$major”exam13$catexam13echo“hermajoris$major”$exam12HismajorisHermajoris??局部變量,在子進程內(nèi)部優(yōu)先使用沒有定義新的變量EnglishComputerscience4.7參數(shù)置換變量參數(shù)置換變量是另一種為變量賦值的方式,其一般形式是:

變量2=${變量1op字符串}其中,op表示操作符,它可以是下列操作符之一:

:-:=:+:?在操作符的前后不留空格。1、變量2=$(變量1:-字符串)作用:如果變量1的值為空,則變量2的值等于給定的字符串;否則變量2的值等于變量1的值,變量1的值保持不變。$catexam15echo–n“PleaseenterTerm1(defaultisNTFS)>>”readfiletypeTerm1=${filetype:-NTFS}echo“filetypeis$Term1now”echo“thevalueoffiletypeis$filetype”$exam15PleaseenterTerm1(defaultisNTFS)>>直接按回車鍵

$exam15PleaseenterTerm1(defaultisNTFS)>>FAT32并按回車鍵

filetypeisNTFSnowthevalueoffiletypeisfiletypeisFAT32nowthevalueoffiletypeisFAT32echo命令后有選項-n,因此echo命令執(zhí)行完后,光標不換行,停在最后面。4.8算術(shù)運算bash中執(zhí)行整數(shù)算術(shù)運算的命令是let,其語法格式為:

letarg…

其中arg是單獨的算術(shù)表達式。例如:let“j=i*6+2”

等價于:((j=i*6+2))當(dāng)let命令計算表達式的值時,若最后結(jié)果不為0,則let命令返回值為0,表示“真”;否則返回值為1,表示“假”這樣,let命令可用于if語句的條件測試。bash中執(zhí)行整數(shù)算術(shù)運算的命令是let,其語法格式為:

letarg…其中arg是單獨的算術(shù)表達式。它使用C語言中表達式的語法、優(yōu)先級和結(jié)合性。除++、--和逗號(,)之外,所有整型運算符都得到支持,此外,還提供了方冪運算符“**”。在算術(shù)表達式中直接利用名稱訪問命名的參數(shù),不要前面帶有“$”符號let命令的替代表示形式是:((算術(shù)表達式))例如:let“j=i*6+2”

等價于:((j=i*6+2))如果表達式的值是非0,那么返回的狀態(tài)值是0;否則,返回的狀態(tài)值是1。運算符分優(yōu)先級,其中1級最高,15級最低;可以使用括號,用來改變運算符的操作順序,即:先計算括號內(nèi)的表達式;當(dāng)表達式中有shell的特殊字符時,必須用雙引號將其括起來。例如:let“val=a|b”,如果不括起來,則shell會把命令行里的|看成管道符。只有使用$((算術(shù)表達式))的形式才能返回表達式的值$echo“((12*9))”((12*9))$echo“$((12*9))”1084.9控制結(jié)構(gòu)

4.9.1if語句if語句用于條件控制結(jié)構(gòu)中,其一般格式為:

if測試條件

then命令1else命令2fi其中,if、then、else和fi是關(guān)鍵字。例如:Shell具有一般高級程序設(shè)計語言所具有的控制結(jié)構(gòu),如:if,case語句,循環(huán)結(jié)構(gòu)和函數(shù)等。在shell中,這些控制結(jié)構(gòu)也稱為“命令”,為了程序設(shè)計的習(xí)慣,才把它們稱為語句。通常if語句的測試條件部分是利用test命令實現(xiàn)的。iftest-f"$1"thenecho"$1isanordinaryfile."elseecho"$1isnotanordinaryfile."fi測試$1的值所代表的文件,是否是一個已經(jīng)存在的普通文件-e

該檔名是否存在

-f

該檔名是否為普通文件(file)

-d

該文件名是否為目錄(directory)

-b

該文件名是否為一個blockdevice裝置

-c

該文件名是否為一個characterdevice裝置

-S

該檔名是否為一個Socket檔案

-p

該檔名是否為一個FIFO(pipe)檔案

-L

該檔名是否為一個連結(jié)檔

test命令各選項的含義:條件判斷部分也可以用一般命令執(zhí)行成功與否來判斷,所以if語句更一般的表達形式是:if命令表1then命令表2else命令表3fiif語句中else部分可以缺省。例如,

iftest-f"$1"thenecho"$1isanordinaryfile."fiif語句的else部分還可以是else—if結(jié)構(gòu),則用關(guān)鍵字“elif”代替“elseif”。例如,

iftest-f"$1"thenecho"$1isanordinaryfile."eliftest-d"$1"then(cd$1;ls)elseecho"$1isneitherafilenoradirectory."fi$catex10echo“Typeintheusername:”readuserifwhoamigrep$user/etc/passwd>/tmp/zh1thenecho“$userexists.”cp/tmp/zh1tmp1rmzh1elseecho“$userdoesn’texists.”

當(dāng)測試條件由一條或多條命令組成時,以最后一條命令是否執(zhí)行成功為準,來判斷then和else【例】/etc/passwd是一個文本文件,存放所有注冊的用戶名和密碼$ex10Typeintheusername:

liu(按下回車鍵)rootpts/0Feb115:46(:0.0)liuexists.$cattmp1liu:x:200:500::/home/zhangsan:/bin/bash

$ex10Typeintheusername:

abc(按下回車鍵)

rootpts/0Feb115:46(:0.0)abcdoesn’texists.

假設(shè)abc用戶在passwd文件中不存在。4.9.2條件測試條件測試有三種常用形式:一種是用test命令,如上所示;另一種是用一對方括號將測試條件括起來。這兩種形式是完全等價的。例如,測試位置參數(shù)$1是否是已存在的普通文件,可寫為:

test-f"$1“

也完全可寫成:[-f"$1"]第三種形式是:[[條件表達式]]test命令可以和多種系統(tǒng)運算符一起使用。這些運算符可以分為四類:文件測試運算符、字符串測試運算符、數(shù)值測試運算符和邏輯運算符。test命令可以和多種系統(tǒng)運算符一起使用。這些運算符可以分為四類:文件測試運算符字符串測試運算符、數(shù)值測試運算符、邏輯運算符?!纠繉懗鲚敵鼋Y(jié)果$catex11echo–n“Typeinanumber(1-10)”readnumif[[“$num”-lt1-o“$num”-gt10]]thenecho“Errorinput”exit2elif[[!“$num”–lt5]]thenecho“itisnotless5”elseecho“itisless5”fiecho“acceptnumberinvalue”

$bash>ex11

typeinanumber(1-10):12(用戶輸入12,并回車)

Errorinput$ex11

typeinanumber(1-10):3(用戶輸入3,并回車)

itisless5acceptnumberinvalue對照表4.6和邏輯運算符以指定的狀態(tài)值退出,0表示執(zhí)行成功,其他表示失敗。5.特殊條件測試(1):表示不做任何事情,其退出值為0。(2)true表示總為真,其退出值總是0。(3)false表示總為假,其退出值是255。4.9.3case語句case語句允許進行多重條件選擇。其一般語法形式是:

case字符串in

模式字符串1)命令

命令;;

模式字符串n)命令

命令;;esac執(zhí)行過程是:用“字符串”的值依次與各模式字符串進行比較,如果發(fā)現(xiàn)某一個匹配,則執(zhí)行該模式字符串之后的各個命令,直到遇到兩個分號為止;如果沒有任何匹配項,則不執(zhí)行任何命令。$catcaseexp1

echo“pleasechooseanumberfrom1,2,3”echo“1:copyafile”echo“2:deleteafile”echo“3:quite”readnumbercase$numberin1)cpmyfilenewfile;;2)rmmyfile;;3)echo“Goodbye”;;esac在使用case語句時應(yīng)注意:每個模式字符串后面可有一條或多條命令,其最后一條命令必須以兩個分號(即;;)結(jié)束。模式字符串中可以使用通配符如果一個模式字符串中包含多個模式,那么各模式之間應(yīng)以豎線(|)隔開,表示各模式是“或”的關(guān)系,即只要給定字符串與其中一個模式相配,就會執(zhí)行其后的命令表各模式字符串應(yīng)是唯一的,不應(yīng)重復(fù)出現(xiàn)。case語句以關(guān)鍵字esac(是case倒過來寫!)結(jié)束。case的退出(返回)值是整個結(jié)構(gòu)中最后執(zhí)行的那個命令的退出值。若沒有執(zhí)行任何命令,則退出值為零。4.9.4while語句shell中有三種用于循環(huán)的語句,它們是:while語句、for語句和until語句。while語句的一般形式是:

while測試條件

do

命令表

done測試條件部分除使用test命令或等價的方括號外,還可以是一組命令。根據(jù)其最后一個命令的退出值決定是否進入循環(huán)體執(zhí)行。$catwhileexp1while[$1]doif[-f$1]thenecho“display:$1”cat$1elseecho“$1isnotafilename”fishiftdoneshift語句放在循環(huán)體的末尾,是什么作用?$catexp2

echo–n“typeinfilename”readfilenameecho“typeindataforthisfile”whilereaddataxdoecho$datax>>$filenamedonecat$filename4.9.5until語句

until語句的一般形式是:

until測試條件

do

命令表

done它與while語句很相似,只是測試條件不同:當(dāng)測試條件為假時,才進入循環(huán)體,直至測試條件為真時終止循環(huán)。4.9.6for語句for語句是最常用的建立循環(huán)體的語句,使用方式主要有兩種:值表方式、算術(shù)表達式方式。1.值表方式其一般格式是:

for變量[in值表];do命令表;done

根據(jù)循環(huán)變量的取值方式,其使用格式可分為三種:

格式一:

for變量in值表

do

命令表

donefordayinMondayWednesdayFridaydoecho$daydone依次為變量day賦值格式二:

for變量in文件正則表達式

do

命令表

done

變量的值依次取當(dāng)前目錄下與正則表達式匹配的文件名,并進入循環(huán),執(zhí)行命令表。例:

forfileinm*.cdocat$file|prdone一個正則表達式,就是用某種模式去匹配一類字符串的一個公式。按分頁格式顯示格式三:值表可以全部是位置參數(shù),此時格式如下:

foriin$*等價于

for變量

dodo

命令表命令表

donedone$catex13dir=$1;shiftif[-d$dir]thencd$dirfornamedoif[-f$name]thencat$nameecho“Endof${dir}/$name”elseecho“errorfilename:${dir}/$name”doneelseecho“errordirectoryname:$dir”fi

$ex13/home/zhangm1.cm2.cm3.c【例4.15】for語句的使用,讀以下代碼,并回答問題提問:1、位置參數(shù)的值各為多少?

$0=ex13$1=/home/zhang$2=m1.c$3=m2.c$4=m3.c2、第2行shift語句的作用是?移動位置參數(shù),從m1.c開始取值3、“forname”是什么意思?變量name的值依次取位置參數(shù)的值4、for語句的循環(huán)體執(zhí)行了幾次?

3次5、${dir}/$name為什么用{}?以免系統(tǒng)將dir與后面的字符一起讀成變量名2.For語句使用算術(shù)表達式方式其一般格式是:

for((e1;e2;e3))do

命令表

done

其中:e1,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論