




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、深圳懷谷信息技術(shù)有限公司http:/www.http:/Linux shell 編程編程V 1.02深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/課程內(nèi)容課程內(nèi)容 第一部分:Linux Shell 簡介 第二部分:Shell 程序設(shè)計基礎(chǔ) 第三部分:Shell 程序設(shè)計流程控制 第四部分:Shell函數(shù)3深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/Linux Shell 簡介簡介第一部分4深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/Linux Shell 簡介簡介Shell 簡介 命令解釋
2、語言 程序設(shè)計語言 當(dāng)一個用戶登陸linux 系統(tǒng)后,系統(tǒng)就會為該用戶創(chuàng)建一個shell進(jìn)程。Shell版本: Bourne Shell:是貝爾實驗室開發(fā)的,unix普遍使用的shell,在編程方面比較優(yōu)秀,但 在用戶交互方面沒有其他shell優(yōu)秀。 BASH: 是GNU的Bourne Again Shell,是GNU操作系統(tǒng)上默認(rèn)的shell,在 bourne shell基礎(chǔ)上增強(qiáng)了很多特性,如命令補(bǔ)全,命令歷史表等等 Korn Shell:是對Bourne Shell 的發(fā)展,在大部分內(nèi)容上與Bourne Shell兼容,集成 了C Shell和Bourne shell優(yōu)點(diǎn)。 C Shel
3、l:是SUN公司Shell的BSD版本,語法與c語言相似,比bourne shell 更適合編程5深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/Linux Shell 案例案例Shell案例:rootsugarCRM # vi myshell.sh#!/bin/shecho hello,world“rootsugarCRM # chmod u+x myshell.shrootsugarCRM # ./myshell.shhello,world6深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/Shell 程序設(shè)計基礎(chǔ)程序設(shè)計基礎(chǔ)第
4、二部分7深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.1 Shell 輸入輸出2.2 Shell 后臺執(zhí)行命令2.3 引號2.4 Shell 變量,參數(shù)Shell 程序設(shè)計基礎(chǔ)程序設(shè)計基礎(chǔ)8深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.1 Shell輸入輸出輸入輸出2.11 echo 2.12 read2.13 cat 和管道2.14 tee 2.15 標(biāo)準(zhǔn)輸入,輸出和錯誤 結(jié)合使用標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤 合并標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤 9深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.11 S
5、hell輸入輸出輸入輸出echoecho命令:用來顯示文本行或變量取值,或者把字符串輸入到文件中格式: echo stringecho的常用功能:c 不換行 f 不進(jìn)紙 t 跳格 n 換行note: 對于linux系統(tǒng),必須使用-e選項來使以上轉(zhuǎn)義符生效 例:$ echo -e “hellotboy” $ helloboy echo命令對特殊字符敏感,如果要輸出特殊字符,需要用屏蔽其特殊含義。 常用的特殊字符:雙引號 “” 反引號 反斜線 例:$ echo “ “ ” ” /輸出“” $ “ ” 10深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.11 Ex
6、ercise:echo1、 編寫shell腳本,借助echo命令分別輸出系統(tǒng)中SHELL,PATH變量的取值。2、 編寫shell腳本,使用一個echo命令輸出如下格式的內(nèi)容(注意對齊格式):idnamemsg01mike“hello”02john“hi”11深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.12 Shell輸入輸出輸入輸出read從鍵盤或者文件的某一行文本中讀入信息,并將其賦給一個變量。格式: read var1 var2 例1:$ read name Hello I am superman $ echo $name $ Hello I am
7、 superman /顯示結(jié)果 如果輸入的值個數(shù)多于變量個數(shù),多余的值會賦給最后一個變量: 例2:$ read name surname John Mike Kate $ echo $surname12深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.12 Exercise:read1、 編寫shell腳本,實現(xiàn)功能:接收用戶輸入的值,并顯示在屏幕上。2、 編寫shell腳本,使用read命令讀取user和password變量, 第一次:輸入 mike 1234567 第二次:輸入 mike 第三次:輸入 mike john 123456 分別使用echo命令
8、查看user,password的取值,比較有何不同?13深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.13 Shell輸入輸出輸入輸出cat ,管道管道cat可以用來顯示文件,并且支持將多個文件串連接后輸出 note:該命令一次顯示完整個文件,若想分頁查看,需使用more格式: cat options filename1 filename2 常用 options: -v 顯示控制字符 -n 對所有輸出行進(jìn)行編號 -b 與-n相似,但空白行不編號 例:$ cat file1 file2 file3 同時顯示三個文件 $ cat b file1 file2 f
9、ile3管道 |可以通過管道把一個命令的輸出傳遞給另外一個命令做為輸入格式: 命令1 | 命令2 例:$ cat test.txt | grep hello14深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.13 Exercise:cat 管道管道1、 編寫shell腳本,對文件file1,file2,file3內(nèi)容合并,并對每行進(jìn)行編號。2、 編寫shell腳本,對文件file1,file2,file3統(tǒng)計非空行共有多少?15深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.14 Shell輸入輸出輸入輸出teetee把輸
10、出的一個副本輸送到標(biāo)準(zhǔn)輸出,另一個副本拷貝到相應(yīng)的文件中如果想看到輸出的同時,把輸出也同時拷入一個文件,這個命令很合適 格式: tee -a file -a 表示文件追加到末尾 file 表示保存輸出信息的文件tee命令一般和管道符 | 結(jié)合起來使用例:$ who | tee 該命令的信息返回在屏幕上,同時保存在文件中16深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.14 Exercise: tee1、 使用tee命令將當(dāng)前系統(tǒng)中所有進(jìn)程的信息保存到文件pid_info 中2、 使用tee命令和who命令將當(dāng)前系統(tǒng)中登陸的
11、終端信息追加到文件 login_info 中17深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.15 Shell輸入輸出標(biāo)準(zhǔn)輸入,輸出和錯誤輸入輸出標(biāo)準(zhǔn)輸入,輸出和錯誤當(dāng)我們在shell中執(zhí)行命令的時候,每個進(jìn)程都和三個打開的文件相聯(lián)系,并使用文件描述符來引用這些文件,見下表- 文件文件 文件描述符文件描述符 輸入文件輸入文件- -標(biāo)準(zhǔn)輸入標(biāo)準(zhǔn)輸入 0 0 輸出文件輸出文件- -標(biāo)準(zhǔn)輸出標(biāo)準(zhǔn)輸出 1 1 錯誤輸出文件錯誤輸出文件- -標(biāo)準(zhǔn)錯誤標(biāo)準(zhǔn)錯誤 2 2-系統(tǒng)中實際上有12個描述符,可以任意使用文件描述符39標(biāo)準(zhǔn)輸入 對應(yīng)文件描述符0,是命令的輸入,默認(rèn)
12、是鍵盤標(biāo)準(zhǔn)輸出 對應(yīng)文件描述符1,是命令的輸出,默認(rèn)是終端標(biāo)準(zhǔn)錯誤 對應(yīng)文件描述符2,是命令錯誤的輸出,默認(rèn)是終端 利用文件重定向功能對命令的標(biāo)準(zhǔn)輸入,輸出和錯誤進(jìn)行修改:18深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.15 Shell輸入輸出文件重定向輸入輸出文件重定向常用文件重定向命令: command file: 標(biāo)準(zhǔn)輸出重定向到一個文件,錯誤仍然輸出屏幕 command file: 標(biāo)準(zhǔn)輸出重定向到一個文件(追加) command 1file1: 標(biāo)準(zhǔn)輸出重定向到一個文件 command 2file2: 標(biāo)準(zhǔn)錯誤重定向到一個文件(追加) comm
13、and 1file 2&1:標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤一起重定向到一個文件 commandfile 2&1: 標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯誤一起重定向到一個文件(追加) command file2:以file1做為標(biāo)準(zhǔn)輸入,file2做為標(biāo)準(zhǔn)輸出 command file 2&1 可以修改為commandfile 2file 19深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.15 Shell輸入輸出文件重定向輸入輸出文件重定向重定向標(biāo)準(zhǔn)輸出: 例:$ ls l myfile.out重定向標(biāo)準(zhǔn)輸入: 例:$ sort name.out 從name.txt
14、讀入數(shù)據(jù)進(jìn)行排序,然后將排序結(jié)果輸出到文件name.out中重定向標(biāo)準(zhǔn)錯誤 例:$ ls ddd 2 /dev/null ddd不存在,標(biāo)準(zhǔn)錯誤信息會輸送到系統(tǒng)垃圾箱,而不會輸送到屏幕 如果標(biāo)準(zhǔn)錯誤信息有用,可以將其存放到錯誤文件中20深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.15 Exercise:文件重定向文件重定向1、 使用文件重定向功能將MySQL-client-5.0.16-0.i386的安裝信息記錄到文件 mysql_install.log 文件中。2、 使用文件重定向功能將MySQL-server-5.0.16-0.i386的安裝信息追加
15、到 mysql_install.log 文件中。3、 使用文件重定向功能將ls ddd的錯誤信息保存在錯誤日志error.log文件中, 說明:ddd 目錄并不存在。4、 使用文件重定向功能將 ls ddd 的錯誤信息既不輸出到屏幕,也不輸出到錯誤文件。5、 編寫腳本,實現(xiàn)功能:讀取文件myfile中一行數(shù)據(jù),并通過echo打印出來21深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.2 Shell后臺執(zhí)行命令后臺執(zhí)行命令 2.21 設(shè)置crontab文件,并用它來提交作業(yè)2.22 在后臺提交作業(yè) &名詞解釋:cron 系統(tǒng)調(diào)度進(jìn)程,可通過它按照一定的
16、時間間隔或固定的時間點(diǎn)運(yùn)行作業(yè)& 使用它在后臺運(yùn)行一個占用時間較長的進(jìn)程 22深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.21 Shell后臺執(zhí)行命令后臺執(zhí)行命令cron cron 是系統(tǒng)的調(diào)度進(jìn)程,可在無人干預(yù)的情況下運(yùn)行作業(yè),通過crontab的命令允許用戶提交,編輯或者刪除相應(yīng)的作業(yè)。每個用戶都有一個crontab文件來保存作業(yè)調(diào)度信息,通過該命令運(yùn)行任意一個shell腳本或者命令在大的系統(tǒng)中,系統(tǒng)管理員可以通過cron.deny和cron.allow這兩個文件來禁止或允許用戶擁有自己的crontab文件 -crontab的域- 第1列分鐘
17、159 第2列小時123(0表示子夜) 第3列日131 第4列月112 第5列星期06(0表示星期天) 第6列要運(yùn)行的命令 -23深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.21 Shell后臺執(zhí)行命令后臺執(zhí)行命令cron crontab格式: 分分時時日日月月星期星期要運(yùn)行的命令要運(yùn)行的命令 表示空格 note:如果要表示范圍的話,如周一到周五,可以用1-5表示 如果要列舉某些值, 如周一,周五,可以用1,5表示 例1:30 21 * * * /apps/bin/cleanup.sh 表示:每天21點(diǎn)30分運(yùn)行/app/bin目錄下的腳本cleanup
18、.sh 例2:0,30 18-23 * * * /apps/bin/dbcheck.sh 表示:每天的18:00到23:00之間每隔半小時運(yùn)行腳本backup.sh腳本24深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.21 Shell后臺執(zhí)行命令后臺執(zhí)行命令cron crontab的命令選項 格式:crontab -u user -e -l -r 其中 -u 用戶名 -e 編輯crontab文件 -l 列出crontab文件中的內(nèi)容 -r 刪除crontab文件 如果使用自己的名字登陸,就不用使用-u選項創(chuàng)建一個新的crontab文件 修改$HOME目錄下
19、的.bash_profile文件,加入環(huán)境變量 EDITOR=vi; export EDITOR /注:修改后重新登陸25深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.21 Shell后臺執(zhí)行命令后臺執(zhí)行命令cron 創(chuàng)建后臺任務(wù)的步驟: 1 創(chuàng)建一個文件,建議名為cron,例wuxhcron,在文件中加入如下內(nèi)容: 1 * * * * /usr/local/apache2/bin/apachectl start 3 * * * * /usr/local/apache2/bin/apachectl stop 保存退出 2 提交剛剛創(chuàng)建的cron文件wuxh
20、cron $ crontab wuxhcron 3 檢查執(zhí)行是否成功 $ ls /var/spool/cron/ 是否生成文件wuxh26深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.21 Shell后臺執(zhí)行命令后臺執(zhí)行命令cron 列出crontab文件 $ crontab l $ crontab l $HOME/mycron 可以通過這種方法對crontab進(jìn)行備份編輯crontab文件 $ crontab -e 修改后保存退出,cron會對其進(jìn)行必要的完整性檢查27深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.2
21、1 Shell后臺執(zhí)行命令后臺執(zhí)行命令cron 刪除crontab文件 $ crontab rcrontab文件的恢復(fù) 如果誤刪了crontab文件,假設(shè)在$HOME目錄下還有備份,可以將這個備份文件拷貝到/var/spool/cron/ username是用戶名,如果由于權(quán)限問題無法拷貝,可以使用 $ crontab note:filename是備份的crontab文件的名字crontab的重啟$ /etc/init.d/crond stop$ /etc/init.d/crond start28深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.21 Exer
22、cise:cron1、 分別說明以下任務(wù)的目的: 45 4 1,10,22 * * /apps/bin/backup.sh 10 1 * * 6,0 /usr/local/alert/file_check.sh 59 23 28 * * /usr/local/alert/file_check.sh2、 創(chuàng)建一個crontab任務(wù),要求每小時第1分鐘調(diào)用一個腳本cleanDir.sh 腳本cleanDir.sh 功能:對$HOME/tmp目錄進(jìn)行清除29深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.22 Shell后臺執(zhí)行命令后臺執(zhí)行命令& 當(dāng)在前臺
23、運(yùn)行某個作業(yè)時,終端被該作業(yè)占據(jù),無法繼續(xù)操作。我們可以借助&命令把作業(yè)放到后臺執(zhí)行格式: 命令命令 & 注:1 需要用戶交互的命令不要放在后臺執(zhí)行,否則機(jī)器一直等待輸入 2 后臺程序在執(zhí)行時,執(zhí)行結(jié)果仍然會輸出到屏幕,干擾我們的工作, 建議將這樣的信息重定向到某個文件 即:command out.file 2&1 & 將標(biāo)準(zhǔn)輸出及標(biāo)準(zhǔn)錯誤都定向到一個out.file的文件中 例:$ find /etc -name “hello” -print find.dt 2&1 & 30深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.h
24、ttp:/2.22 Exercise:&1、 使用&符號使apache編譯源碼的進(jìn)程到后臺執(zhí)行,并把編譯的信息 存放到文件make_log中 操作的過程中,思考:如何判斷后臺的這個任務(wù)已經(jīng)完成?31深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.31 引號雙引號引號雙引號 -“”“” 雙引號雙引號 反引號反引號 單引號單引號 反斜線反斜線 -雙引號 可引用除字符$,外的任意字符或者字符串,對$,敏感例1:$ echo “hello”例2:$ echo “$” /想輸出字符$ 結(jié)果看到的是數(shù)值3746 $ echo “$” /對特殊字符需要反斜
25、線屏蔽其特殊含義 $ /得到想要的結(jié)果例3:$ echo “V_V” /想輸出V_V字樣 結(jié)果得到錯誤信息 $ echo “V_V” /得到V_V輸出32深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.32 引號引號- -單引號單引號 單引號 單引號和雙引號的用法基本類似,不同的是單引號對特殊字符不敏感,可以將其做為普通字符輸出出來 例:$ echo $ 結(jié)果 $ 不用借助進(jìn)行屏蔽 $ echo V_V 結(jié)果V_V,和前頁雙引號比較33深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.33 引號引號- -反引號反引號 該命令
26、用于設(shè)置系統(tǒng)命令的輸出到變量,shell將反引號中的內(nèi)容做為命令執(zhí)行。例1:$ echo hello $ sh: hello: command not found例2:$ echo date $ Thu Nov 1 08:48:17 CST 2007對比 $ MYDATE=“date” $ echo $MYDATE $ date反引號可以和雙引號結(jié)合起來使用:例3:$ echo “The date today is date” $ The date today is Thu Nov 1 08:48:17 CST 200734深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.h
27、ttp:/2.34 引號反斜線引號反斜線 反斜線 如果一個字符有特殊含義,為防止shell誤解其含義,可用屏蔽該字符 具有特殊含義的字符 - & * + $ “ | ? - 例1 : $ echo “$” /在屏幕上輸出$字符,結(jié)果顯示3853 $ echo “$” /用反斜線屏蔽,防止shell誤解,結(jié)果顯示$ 例2: $ echo * /在屏幕上輸出*字符,結(jié)果輸出當(dāng)前目錄下內(nèi)容 $ echo * /用反斜線屏蔽,防止shell誤解,輸出*字符 35深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.3 Exercise:引號引號1、 使用 grep
28、 命令查詢 myfile 中是否有字符串“hello” 應(yīng)該怎樣查詢?2、 怎樣使用echo輸出一句話: The pen is $23、 怎樣使用echo輸出一句話 The time is AA ,注AA需要被當(dāng)前系統(tǒng)時 間代替。4、 怎樣使用expr 12 * 12 得到144的結(jié)果5、 怎樣在屏幕上輸出字符串 The price is $19.9936深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.4 Shell 變量變量2.41 環(huán)境變量2.42 本地變量2.43 位置變量2.44 特定變量37深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:
29、/www.http:/2.41 環(huán)境變量環(huán)境變量環(huán)境變量適用于所有用戶進(jìn)程在/etc/profile中進(jìn)行定義在用戶進(jìn)程使用前,必須用export命令導(dǎo)出;建議環(huán)境變量都大寫,設(shè)置環(huán)境變量: var_name=value; export var_name 或者:var_name=value export var_name查看環(huán)境變量取值: echo $var_name unset var_name 刪除某個系統(tǒng)環(huán)境變量注:該命令只是從當(dāng)前用戶進(jìn)程中刪除,不會從文件/etc/profile刪除38深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.41 環(huán)境變量環(huán)
30、境變量嵌入shell變量 一般來講,BASH有一些預(yù)留的環(huán)境變量名,這些變量名不能做其他用 途,通常在/etc/profile中建立這些嵌入的環(huán)境變量,但這不絕對,取決于用戶shell的變量列表: CDPATH; EXINIT; HOME; IFS; LOGNAME; MAIL; MAILCHECK; PATH; PS1; PS2; SHELL; TERMINFO; TERM; TZ 39深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.41 Exercise:環(huán)境變量環(huán)境變量1、 環(huán)境變量應(yīng)該定義在哪個文件中?2、 練習(xí)在/etc/profile文件中定義一
31、個環(huán)境變量 3、練習(xí)使用unset命令刪除環(huán)境變量 40深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.42 本地變量本地變量在用戶當(dāng)前的shell進(jìn)程中使用一般在 $HOME/.bash_profile 中定義。也可以在命令行定義,但只在用戶當(dāng)前shell進(jìn)程中有意義,如果在shell中啟動另一個進(jìn)程或退出,此值將無效。用法:var_name=value查看本地變量取值:echo $var_name or echo $var_name -建議使用刪除變量:unset var_name結(jié)合變量值:echo $var_name1$var_name2測試變量是否
32、設(shè)置: $var:=new_value 若未設(shè)置或未初始化,可用新值41深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.42 本地變量本地變量使用變量保存系統(tǒng)命令參數(shù) 例:$ SOURCE=“/etc/passwd” $ DEST=“/home/wuxh/” $ cp $SOURCE $DEST設(shè)置只讀變量 可設(shè)置某個變量為只讀方式,只讀變量不可更改,否則系統(tǒng)返回錯誤用法:var_name=value readonly var_name 例: $ myvar=“100” $ readonly myvar $ myvar=“200” $ -bash: myva
33、r: readonly variable42深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.42 Exercise:本地變量本地變量1、本地變量定義在哪個文件中?2、分別在命令行和$HOME/.bash_profile文件中定義本地變量, 練習(xí)查看該本地變量的取值 練習(xí)刪除該本地變量。3、練習(xí)在$HOME/.bash_profile文件中定義一個只讀用戶變量,如何 驗證其只讀生效?43深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.43 位置變量位置變量屬于只讀變量作用:向shell腳本傳遞參數(shù),參數(shù)個數(shù)可以任意多,但只有
34、前9個被訪問到, shift命令可以更改這個限制。每個訪問參數(shù)前加$, 第一個參數(shù)為0,表示預(yù)留保存實際腳本名字,無論腳本是否有參數(shù),此值均可用,如:給腳本test傳遞信息:Would you like to do it$0 $1 $2 $3 $4 $5 $6 $7 $8 $9腳本名字 would you like to do it例:$ vi test 44深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.43 位置變量位置變量#!/bin/shecho “The script name is : $0 ”echo “The first parameter
35、is :$1”echo “The second parameter is :$2”echo “The third parameter is :$3”echo “The fourth parameter is :$4”echo “The fifth parameter is :$5”echo “The sixth parameter is :$6”echo “The seventh parameter is :$7”echo “The eighth parameter is :$8”echo “The ninth parameter is :$9”保存文件,執(zhí)行 $ test would you
36、 like to do it45深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.43 位置變量位置變量 note:上例中$0返回的信息中包含路徑名,如果只想得到腳本名稱,可以借 助basename,將腳本中第一句修改為: echo “The script name is : basename $0 ” 保存文件,執(zhí)行 test would you like to do it note:basename 用 向系統(tǒng)命令傳遞參數(shù) 可以在腳本中向系統(tǒng)命令傳遞參數(shù) $ vi findfile #!/bin/sh find / -name $1 保存,執(zhí)行 $ ./f
37、indfile passwd46深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.43 Exercise:位置變量位置變量1、 寫一個簡單的腳本文件catfile.sh,要求實現(xiàn)的功能: 用戶隨意輸入3個文件名,這3個文件的內(nèi)容能夠被cat命令連接起來顯示, 并且所有行都被標(biāo)號; 用戶輸入的文件名可能真實存在,也可能不存在,需要將標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯 誤分別重定向到文件catfile.log和catfile.err47深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.44 特定變量特定變量特定變量反映腳本運(yùn)行過程中的控制信息特定的
38、shell變量列表: $#傳遞到腳本的參數(shù)個數(shù) $*以一個單字符串的形式顯示所有向腳本傳遞的參數(shù),與位置變量不同,此項參數(shù)可超過9個 $腳本運(yùn)行的當(dāng)前進(jìn)程id號 $!后臺運(yùn)行的最后一個進(jìn)程的進(jìn)程id號 $與$*相同,但是使用時加引號,并在引號中返回每個參數(shù) $?顯示最后命令的退出狀態(tài),0表示正確,其他任何值表示錯誤48深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.44 特定變量特定變量例:修改test腳本,最后添加粗體部分:#!/bin/shecho “The script name is : $0 ”echo “The first parameter i
39、s :$1”echo “The ninth parameter is :$9”echo “The number of arguments passed :$#”echo “Show all arguments :$*”echo “Show my process id :$”echo “Show me the arguments in quotes :$”echo “Did my script go with any errors :$?”49深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/2.44 特定變量特定變量最后的退出狀態(tài) $? 可以在任何腳本或者命令中返
40、回此變量以獲得返回信息,基于此信息, 可以在腳本中做更進(jìn)一步的研究,返回0為成功,1為失敗例1:$ cp /etc/passwd /home/wuxh/myfile $ echo $? $ 0例2:$ cp /etc/passwd /home/wuxh/mydir $ echo $? $ 1 建議將返回值設(shè)置為一個有意義的名字,增加腳本的可讀性 修改例2 $ cp_status=$? $ echo $cp_status50深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/Shell程序設(shè)計流程控制程序設(shè)計流程控制第三部分51深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)
41、有限公司http:/www.http:/3 Shell 程序設(shè)計流程控制程序設(shè)計流程控制3.1 test 測試命令3.2 expr 測試語句3.3 If 條件判斷3.4 for 循環(huán)3.5 while 和until循環(huán)3.6 case 條件選擇3.7 break 和continue 52深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.1 test 語句文件測試語句文件測試文件測試 測試文件狀態(tài): 用法:test condition 或者 condition -文件狀態(tài)列表- -d 目錄 -s 文件長度大于0,非空 -f 常規(guī)文件 -w 文件可寫 -L 符號文
42、件 -r 文件可讀 -x 文件可執(zhí)行 -例:$ ls -l hello $ -w hello $ echo $?53深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.1 test 語句文件測試語句文件測試文件測試 使用邏輯操作符: 測試文件狀態(tài)是否ok,可以借助邏輯操作符對多個文件狀態(tài)進(jìn)行比較 -a 邏輯與,操作符兩邊均為真,結(jié)果為真,否則為假 -o 邏輯或,操作符兩邊一邊為真,結(jié)果為真,否則為假 ! 邏輯否,條件為假,結(jié)果為真例1:$ -r myfile1 -a -w myfile2 $ echo $?例2:$ -w myfile1 -o -x myfile
43、2 $ echo $?54深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.1 test 語句字符串測試語句字符串測試字符串測試 字符串測試是錯誤捕獲很重要的一部分,特別是用戶輸入或比較變量時尤為重要 格式: test “string” test string_operator “string” test “string” string_operator “string” string_operator string string string_operator string 注:string_operator 的取值: = 等于 != 不等于 -z 空串 -
44、n 非空串例:測試環(huán)境變量EDITOR是否為空55深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.1 test 語句字符串測試語句字符串測試 $ -z $EDITOR $ echo $? 為空返回0,否則返回1如果非空,取值是否為vi $ $EDITOR = “vi” $ echo $?測試變量string1是否等于string2 $ string1”hello” $ string2”Hello” $ “$string1” = “$string2” $ echo $? note:在進(jìn)行字符串比較時,建議加引號56深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公
45、司http:/www.http:/3.1 test 語句數(shù)值測試語句數(shù)值測試 數(shù)值測試 格式:“number” number_operator “number” 或者: “number” number_operator “number” number_operator 的取值范圍: -eq 數(shù)值相等 -gt 第一個數(shù)大于第二個數(shù) -ne 數(shù)值不相等 -lt 第一個數(shù)小于第二個數(shù) -le 第一個數(shù)小于等于第二個數(shù) -ge 第一個數(shù)大于等于第二個數(shù)例:$ NUM1130 $ $NUM1 eq 130 $ echo $?57深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http
46、:/3.1 test 語句數(shù)值測試語句數(shù)值測試 例:$ 990 -le 996 -a 123 -gt 33 $ echo $?58深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.1 Exercise:test測試語句測試語句1、 使用test命令判斷一個對象是否是目錄,并查看判斷結(jié)果2、 使用test命令判斷一個文件是否是鏈接文件,并查看結(jié)果3、 使用test命令判斷一個文件是否非空并且可寫,并查看結(jié)果4、 使用test命令判斷“hello”和“HELLO”字符串是否相等5、 使用test命令判斷“ ”是否為空串6、 執(zhí)行一個腳本文件時,需要用戶輸入36個位
47、置參數(shù),怎樣使用test語句來判斷用戶輸入的參數(shù)是在36個范圍內(nèi)59深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.2 expr 語句字符串測試和數(shù)值測試語句字符串測試和數(shù)值測試 一般用于整數(shù)值,也可以用于字符串;格式:expr argument operator argumentexpr 也是個手工命令行的計數(shù)器 $ expr 10 + 10 注意空格 $ expr 300 / 6 / 5 $ expr 30 * 3 注意:乘號必須用反斜線屏蔽其特定含義增量計數(shù) expr在循環(huán)中用于增量計算,首選,循環(huán)初始化為0,然后循環(huán)加1,常用的做法:從expr接受輸
48、出賦給循環(huán)變量例:$ LOOP=0 $ LOOP=expr $LOOP + 160深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.2 expr 語句字符串測試和數(shù)值測試語句字符串測試和數(shù)值測試數(shù)值測試 可以用expr測試一個數(shù),如果對非整數(shù)進(jìn)行計算,則返回錯誤 例:$ expr 1.1 + 1 返回錯誤 $ expr 1 + 1 返回2字符串測試 注 expr 也有返回的狀態(tài),但與系統(tǒng)最后返回的值剛好相反,expr返回成功為1,其他值為失敗。 例:$ value=hello $ expr $value = “hello”/注意=前后都有空格 $ 1 /這是e
49、xpr執(zhí)行成功的值 $ echo $? $ 0 /這是系統(tǒng)返回的成功的值61深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.2 Exercise:expr測試語句測試語句1、使用echo命令輸出一句話:300/5*6=360 注意:結(jié)果部分360需要使用expr命令運(yùn)算出來,而不是直接給出結(jié)果2、如果一個腳本中定義了一個變量,這個變量可以按照用戶執(zhí)行腳本時指定的數(shù)值進(jìn)行自增操作 這個變量的自增語句在腳本中該如何寫?62深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.3 if 條件語句條件語句格式:if 條件條件1 then
50、 命令命令1 elif 條件條件2 then 命令命令2 else 命令命令3 /注:藍(lán)色部分為可選部分 fi注意:使用if語句時,必須將then部分放在新行,否則會產(chǎn)生錯誤,如果要不分行,必須使用命令分割符,即: if 條件1; then 命令1 fi63深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.3 if 條件語句條件語句例:$ vi myfile.sh #!/bin/shIf “l(fā)s -A $DIRECTORY” =“” ; then echo “$DIRECTORY is indeed empty” else echo “$DIRECTORY i
51、s not empty” fi 64深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.3 Exercise: if 條件語句條件語句1、 寫一個腳本,要求用戶可以隨意輸入一個帳號,打印出該帳號,如果帳號為 空,打印“You did not enter any info”2、 當(dāng)前目錄的user.txt文件中存放多個用戶的信息,要求用戶可以隨意輸入一 個登陸帳號,腳本會到user.txt中查找是否存在該帳號,如果存在,打印“用 戶xxx可以登陸系統(tǒng)”,否則,打印“用戶xxx是非法用戶”,請在練習(xí)1的基礎(chǔ) 上修改.3、 寫一個腳本,實現(xiàn)創(chuàng)建目錄的功能,目錄的名稱由
52、用戶給出,需要對如下情 況進(jìn)行判斷處理: 1 用戶沒有給出參數(shù) 2 用戶給出的目錄名稱是否在當(dāng)前目錄存在,如果存在,提示用戶重新創(chuàng)建 3 目錄創(chuàng)建成功或者失敗,都給出說明信息 65深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.4 for 循環(huán)循環(huán)格式:for 變量名變量名 in 列表列表 do 命令命令1 命令命令2 done說明:命令 可為任何有效的shell命令和語句 變量名可以為任何單詞 in列表是可選的,如果沒有列表,for循環(huán)會使用命令行的位置參數(shù) in列表可以包含替換,字符串,文件名例:例:66深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司h
53、ttp:/www.http:/3.4 for 循環(huán)循環(huán)#!/bin/shfor loop1 in 1 2 4 5 6 /數(shù)字列表數(shù)字列表do echo $loop1donefor loop2 in he is a tall man /字符串列表字符串列表do echo $loop2donefor loop3 in ls /替換列表替換列表do echo $loop3done67深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.4 for 循環(huán)循環(huán)對for 循環(huán)使用參數(shù),當(dāng)循環(huán)中省去in列表選項時,它將接受命令行特定變量做為參數(shù)即 for params in “
54、$” 或者或者 for params in “$*”例例1:打印:打印shell腳本的參數(shù)。文件名腳本的參數(shù)。文件名for2.sh#!/bin/shfor params in “$*”doecho “You supplied $params as a command line option”doneecho $params./for2.sh a b c d e f 68深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.4 for 循環(huán)循環(huán)例2 使用for循環(huán)統(tǒng)計文件數(shù)#!/bin/shcounter=0for files in lsdocounter = ex
55、pr $counter + 1doneecho “There are $counter files in pwd we need to process” 69深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.5 while 和和 until格式:while 條件條件 do 命令1 命令2 donenote:do和done之間命令,只有前一個返回狀態(tài)為0,后面命令才會被執(zhí)行;否則則循環(huán)中止 格式:until 條件 do 命令1 . donenote:until執(zhí)行一系列命令,直到條件為真時停止。70深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/ww
56、w.http:/3.5 while 和和 until例1: #!/bin/sh while read FILM do echo “the info is: $FILM” done &2 exit 1 fi OPT=$1 case $OPT in start) echo “starting.basename $0” # code here to start a process ;75深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.6 case 條件選擇條件選擇 stop) echo “stopping.basename $0” # code here
57、to stop a process ; help) # code here to display a help page ; *) echo “Usage:basename $0 start|stop|help” ; esac76深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/1、編寫一個用于啟動、停止、重啟sshd 服務(wù)的腳本;要求:使用case 語句編寫sshd 服務(wù)的啟動和停止,可以直接使用/etc/init.d/sshd 腳本腳本以如下形式執(zhí)行:$ ./yourscript.sh start$ ./yourscript.sh stop$ ./yoursc
58、ript.sh restart要能夠處理異常(非預(yù)期的位置參數(shù))3.6 Exercise: case條件選擇條件選擇77深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.7 break 和和 continue有時需要某些準(zhǔn)則退出循環(huán)或者跳過循環(huán)步,就需要break和continue來實現(xiàn) break 允許跳出循環(huán)或者case語句,在嵌套循環(huán)里,可以指定跳出的循環(huán)個數(shù),例在兩層的嵌套循環(huán)內(nèi),break 可以跳出整個循環(huán) continue 類似于break,區(qū)別是continue只會跳過當(dāng)前的循環(huán)步,而不會跳出整個循環(huán)78深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有
59、限公司http:/www.http:/3.7 break 和和 continue例1:#!/bin/sh while : do echo n “Enter any number 1.5 :” read ANS case $ANS in 1|2|3|4|5) echo “great! you entered a number between 1 and 5” ; *) echo “wrong number.bye!” break ; esac done79深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.7 break 和和 continue例2 : names
60、2.txt 內(nèi)容包含雇員名字,部門,及其id,如下所示: -內(nèi)容如下- -LISTING OF PERSONNEL FILE- - TAKEN AS AT 06/1999- Louise Conrad:Accounts:ACC8987 Peter James:Payroll:PR489 Fred Terms:Customer:CUS012 James Lenod:Accounts:ACC887 Frank Pavely:Payroll:PR489 -要求:讀取names2.txt文件,將在職員工的名字,部門,部門id讀取打印出來 說明:Peter James已經(jīng)離職 80深圳懷谷信息技術(shù)有限公司深圳懷谷信息技術(shù)有限公司http:/www.http:/3.7 break 和和 continue例3:#!/bin/sh
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 湖南省婁底市新化縣東方文武學(xué)校2025屆三年級數(shù)學(xué)第二學(xué)期期末綜合測試試題含解析
- 蒲縣2025年三年級數(shù)學(xué)第二學(xué)期期末調(diào)研試題含解析
- 2025屆陜西省寶雞市重點(diǎn)中學(xué)小升初數(shù)學(xué)入學(xué)考試卷含解析
- 江西省萍鄉(xiāng)市湘東區(qū)2025屆數(shù)學(xué)三下期末經(jīng)典模擬試題含解析
- 新版統(tǒng)編版七年級下冊歷史課件 第14課 遼宋夏金元時期的科技與文化
- 國開《金融學(xué)》單元測試1-3
- 課題開題報告:當(dāng)代文化發(fā)展繁榮與文化立法的關(guān)系研究
- 課題開題報告:傳統(tǒng)工藝精神與設(shè)計專業(yè)學(xué)生技能培養(yǎng)
- 課題開題報告:殘疾人高等教育專業(yè)設(shè)置優(yōu)化改革研究
- 健康檢查協(xié)議書
- 2025年湖北宜昌枝江金潤源集團(tuán)招聘17人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2023CSCO兒童及青少年白血病診療指南
- 第一單元 閱讀綜合實踐(同步課件)【知識精研】七年級語文下冊高效課堂(統(tǒng)編版)
- 初中物理競賽及自主招生專題講義:第8講 電路 (共5節(jié))含解析
- 2024年版慢性阻塞性肺疾病(COPD)診療指南解讀課件
- 2024解析:第八章牛頓第一定律、二力平衡-基礎(chǔ)練(解析版)
- 《傳媒法的原則》課件
- 2024解析:第十三章內(nèi)能-基礎(chǔ)練(解析版)
- 2024年網(wǎng)格員考試題庫含答案
- GB/Z 44047-2024漂浮式海上風(fēng)力發(fā)電機(jī)組設(shè)計要求
- (完整)2019年風(fēng)廉政建設(shè)主體責(zé)任落實情況監(jiān)督檢查記錄表
評論
0/150
提交評論