Linux操作系統(tǒng)第7講Shell程序設計_第1頁
Linux操作系統(tǒng)第7講Shell程序設計_第2頁
Linux操作系統(tǒng)第7講Shell程序設計_第3頁
Linux操作系統(tǒng)第7講Shell程序設計_第4頁
Linux操作系統(tǒng)第7講Shell程序設計_第5頁
已閱讀5頁,還剩32頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第7講Shell程序設計Shell的含義Shell既是一種命令語言,又是一種程序設計語言作為命令語言,它交互式地解釋和執(zhí)行用戶輸入的命令作為程序設計語言,它定義了各種變量和參數(shù),并提供了在高級語言中才有的控制結構,如循環(huán)和分支。目前流行的Shellash:Linux中占用資源最少的一個小Shell,它只包含24個內部命令bash:Linux系統(tǒng)默認的Shell,包含40個內部命令,基于GNU架構發(fā)展而來。ksh:與商業(yè)發(fā)行版的ksh兼容,包含42個內部命令,由AT&TBelllab.發(fā)展而來,兼容于bashcsh:是Linux比較大的內核,共包含52個內部命令,BillJoy設計依附亍BSD版zsh:是Linux最大的Shell之一,共包含84個內部命令,若沒有特殊用途,沒有必要安裝。Bash的功能命令記憶能力,可多達上千個,上次登錄執(zhí)行過的命令記在~/.bash_history,本次在內存命令補全功能,按[Tab]鍵shellscripts通配符:*,?Shell基本語法輸入輸出重定向“>”

輸出重定向到一個文件“>>”

輸出追加到一個文件“<”

輸入重定向管道“|”前臺與后臺前臺:command后臺:command&Shell常用命令bash命令解釋程序包含了一些內部命令。內部命令在目錄列表時是看不見的,它們由shell本身提供。1.echo命令格式:echoarg功能:在屏幕上打印出由arg指定的字符串。2.eval命令格式:evalargs功能:當shell程序執(zhí)行到eval語句時,shell讀入?yún)?shù)args,并將它們組合成一個新的命令,然后執(zhí)行。Shell常用命令3.exec命令格式:exec命令命令參數(shù)功能:當shell執(zhí)行到exec語句時,不去創(chuàng)建新的子進程,而是轉去執(zhí)行指定的命令,當指定的命令執(zhí)行完時,該進程,也就是最初的shell就終止了,所以shell程序中exec后面的語句將不再被執(zhí)行。4.export命令格式:export變量名或:export變量名=變量值功能:shell可以用export把它的變量向下帶入子shell從而讓子進程繼承父進程中的環(huán)境變量。但子shell不能用export把它的變量向上帶入父shell。注意:不帶任何變量名的export語句將顯示出當前所有的export變量。Shell常用命令5.readonly命令格式:readonly變量名功能:將一個用戶定義的shell變量標識為不可變的。不帶任何參數(shù)的readonly命令將顯示出所有只讀的shell變量。6.read命令格式:read變量名表功能:從標準輸入設備讀入一行,分解成若干字,賦值給shell程序內部定義的變量。7.shift語句功能:shift語句按如下方式重新命名所有的位置參數(shù)變量:$2成為$1,$3成為$2……在程序中每使用一次shift語句,都使所有的位置參數(shù)依次向左移動一個位置,并使位置參數(shù)“$#”減一,直到減到0。Shell常用命令8.wait功能:是shell等待在后臺啟動的所有子進程結束。Wait的返回值總是真。9.exit功能:退出shell程序。在exit之后可有選擇地指定一個數(shù)字作為返回狀態(tài)。10.“.”(點)命令格式:.Shell程序文件名功能:使shell讀入指定的shell程序文件并依次執(zhí)行文件中的所有語句。創(chuàng)建和執(zhí)行shell程序1.創(chuàng)建一個別名文件:(bash)示范文件myenv,內容如下:

#!/bin/bashclear cal echohello!!!2.在Linux下可以用以下方法來執(zhí)行mynev. chmod命令:#chmod+xmynev3.執(zhí)行shell程序

命令行上:#./mynev說明:以#開始行表示注釋變量

3種類型:環(huán)境變量:系統(tǒng)提供,不用定義,可以修改內部變量:系統(tǒng)提供,不用定義,不能修改用戶變量:定義,可以修改與其他語言的區(qū)別:非類型性質,也就是不必指定變量是數(shù)字或字符串等。用戶變量舉例例1:字符串變量賦值shell程序my1:

var=”string”newvar=”Valueofvaris$var”echo$newvar執(zhí)行shell程序my1,可得到如下的結果:

Valueofvarisstring例2:數(shù)值變量賦值shell程序mynu:

x=15 echo$x得到如下的結果:

15

變量賦值給變量賦值locunt=0訪問變量值lcount=$var例如要把var的值賦給變量lcountlcount=$var進行數(shù)值運算:(把var的值加5賦給lcount)lcount=$(($var+5))或letlcount=$var+5或lcount=`expr$var+5`環(huán)境變量(注意:變量名大寫)echo$PATH指令ls完整文件名為:/bin/ls(這是絕對路徑),為什么我在任何目錄下輸入ls都可以顯示呢?這是因為環(huán)境變量PATH中的定義!例如[root@www~]#echo$PATH/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

記錄所有搜索路徑環(huán)境變量還有HOME、MAIL、SHELL

常見的環(huán)境變量PATH:決定了shell將到哪些目錄中尋找命令或程序。HOME:當前用戶主目錄。UID:用戶ID。MAIL:當前用戶的郵件存放目錄。SHELL:當前用戶用的是哪種Shell。HISTSIZE:保存歷史命令記錄的條數(shù)LOGNAME:當前用戶的登錄名。HOSTNAME:主機的名稱。內部變量部分內部變量及其作用變量作用

$#傳給shell程序的位置參數(shù)的數(shù)目

$?最后命令的完成碼或在shell程序內所執(zhí)行的shell程序

$0shell程序的名稱

$*調用shell程序所傳送的全部變元的單字符串

my2的示范例子:echo“Numberofparametersis”$#echo“Shellreturncodeis”$?echo“Programnameis”$0echo“Parametersasasinglestringis”$*在bash中,如果從命令行中執(zhí)行my2如下:#./my2wangzhang將得到如下的結果:Numberofparametersis2Programnameismy2

Parametersasasinglestringiswangzhang特殊字符雙引號在字符串含有嵌入的空格時,用雙引號括起來。這是一個有關bash的例子:

var=”teststring”newvar=”Valueofvaris$var”echo$newvar執(zhí)行上面的三行shell程序,可得到如下的結果:./my1

Valueofvaristeststring單引號利用單引號把字符括起來,以阻止shell解析變量。把前面的雙引號改為單引號,執(zhí)行程序可得到如下的結果:./my11

Valueofvaris$var特殊字符

字符說明

$指出shell變量名的開始

|把標準輸出通過管道傳送到下個命令

#標記注釋開始

&在后臺執(zhí)行進程>輸出重定向操作符

<輸入重定向操作符

>>輸出重定向操作符{添加到文件}<<跟在輸入結束自符串后(HERE)操作符.filmname執(zhí)行(“源”)filename文件空格在兩個字之間的間隔符通配符字符說明?匹配一個字符*匹配一個或幾個字符

[]列出字符的范圍,例如[abcd]

[a-z]意指a到z的全部字符

[a,z]意指a或z字符特殊字符反斜杠

在某個字符前利用反斜杠可以阻止shell把后面的字符解釋為特殊字符。例如,把$test的值賦給變量var。輸入如下命令:

var=$test如下命令才把$test存放在var中:

var=\$test

見例子./my111反引號:通知shell執(zhí)行由反引號定義的字符串。

wc當需要把執(zhí)行命令的結果存放在變量中時,就可以在shell程序中利用反引號。例如,要統(tǒng)計當前目錄下一個文件中test.txt有幾行并把結果存在叫做var的變量中:

var=`wc-ltest.txt`pdksh和bash環(huán)境見例子./my1111分支語句ifif語句

if語句通過判斷邏輯表達式來作出選擇,在pdksh和bash中的條件語句有如下的格式:if[expression];thenstatementselif[expression];thenstatementselsestatementsfiif條件是可以嵌套的,

位置參數(shù)及if語句

下述是一個shell程序的my3,只帶了一個參數(shù)(名字),并在屏幕上顯示這個名字:

#Namedisplayprogramif[$#-eq0];thenecho“Namenotprovided”elseecho”Yournameis”$1 fi

在bash中,如果執(zhí)行mypgm1如下:

#./my3

將得到輸出:

Namenotprovided

但是,如果執(zhí)行mypgm1如下:

#./my3wang

則得到如下的輸出:

Yournameiswang

位置參數(shù)

如果把程序my4修改為:

#Namedisplayprogramif[$#-eq0];thenecho“Namenotprovided”elseecho”Yournameis$2” fi

在bash中,如果執(zhí)行mypgm1如下:

#./my4

將得到輸出:

Namenotprovided

但是,如果執(zhí)行mypgm1如下:

#./my4wangzhang

則得到如下的輸出:

Yournameiszhang

mypgm1還說明了shell編程的另一個方面,即內部變量。在mypgm1中的變量$#是內部變量,并提供傳給shell程序的位置參數(shù)的數(shù)目。設計一個Shell程序,讀入一個正整數(shù),如果是奇數(shù)顯示“odd”,如果是偶數(shù)顯示“even”。readxlety=$x/2*2if[$y–eq$x];thenecho“even”elseecho“odd”fi見例子./if測試文件f1是否存在,若存在刪除它,不存在建立文件f1

測試目錄/root/u1是否存在,若存在刪除它,不存在建立它Shell程序設計流程控制bash表達式的比較1.字符串比較

=比較兩個字符串是否相等

!=比較兩個字符串是否不相等

-n判斷字符長度是否大于零

-z判斷字符長度是否等于零bash表達式的比較2.數(shù)字比較

-eq比較兩個數(shù)是否相等

-ge比較一個數(shù)是否大于或是等于另一個數(shù)

-le比較一個數(shù)是否小于或是等于另一個數(shù)

-ne比較兩個數(shù)是否不等

-gt比較一個數(shù)是否大于另一個數(shù)

-lt比較一個數(shù)是否小于另一個數(shù)bash表達式的比較3.文件操作符

-d確定文件是否為目錄

-f確定文件是否為普通文件

-r確定是否對文件設置了讀許可。

-s確定文件名是否具有大于零的長度

-w確定文件是否設置了寫許可

-x確定文件是否設置了執(zhí)行許可bash表達式的比較4.邏輯操作符

邏輯操作符用來根據(jù)邏輯規(guī)則比較表達式。!,-a,-o字符表示NOT、AND和OR!求反(”非”)邏輯表達式

-a邏輯AND(”與”)兩個邏輯表達式

-o邏輯OR(”或”)兩個邏輯表達式循環(huán)語句for語句第一種格式如下:

forcurvarinlistdostatementsdone

對list中的每個值需要執(zhí)行一次statements時應利用這種格式。對每次循環(huán),把list中的當前值賦給變量curvar,list可以使含有幾個項的變量,或是用空格分隔的值表。For語句的這種格式是由pdksh和bash使用的。循環(huán)語句1.for語句假設需要把目錄中的每個文件在一個叫做backup的子目錄中建立備份,可以在bash

中執(zhí)行如下的程序:

mkdirbackup forfilein*.txtdocp$filebackup/$filedone

執(zhí)行后把當前目錄下的.c為后綴的文件拷貝到子目錄backup下見例子./my5求前5個自然數(shù)之和見例子./my6循環(huán)語句while語句格式如下:

whileexpression

dostatementsdone

循環(huán)語句前

溫馨提示

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

評論

0/150

提交評論