SHELL程序的主要用途
在SHELL程序中不僅僅可以使用命令的集合,而且可而且可以安排自動化處理過程,因此可以通過編寫SHELL程序使大量的任務執行實現自動化。SHELL比較擅長完成系統管理任務,尤其適合完成那些易用性、可維護性和便攜性比執行效率更優先的任務。
SHELL程序的執行和調試
⑴在bash的SHELL程序設計中,程序必須以下面的行開始:
#!/bin/bash
這裏符號#!用來告訴系統,後面給出的參數是用來執行該文件的程序。
⑵當編輯完一個SHELL腳本後,要使該腳本能夠執行,還必須使該腳本文件具有可執行權。需要執行命令:chmod +x filename
⑶在shell程序中,以#開頭到一個行結束的句子表示註釋信息。建議大家在編寫shell程序時養成添加註釋的習慣,因爲註釋不僅能給其他需要熟悉悉該程序的人以幫助,也能給出腳本編寫者設計原理的提示。
⑷進行shell程序設計時,必定會用到變量。Shell編程中使用的變量有自己的特色,即所有的變量都是由字符串組成的,而且對變量無須進行聲明,可直接進行變量賦值操作。
程序設計
1.創建以下菜單程序
USER:** HOST: **** DATE: xx/xx/20xx
A: 創建子目錄並複製文件
B: 文件權限測試
C: 文件字符轉換
D: 文件總數及文本行數統計
E: 文件查找
Q: 退出系統
———————————————————————————————
A:在用戶家目錄下創建名字爲本人姓名的子目錄,其存取權限爲(drwxr-xr-x)。測試目錄確實存在後,將已存在的file1、file2兩文件拷入其中並分別顯示兩文件的內容。顯示完成後將file1、file2兩文件截斷爲大小爲0的空文件。
B:測試當前用戶對系統中某文件是否有r、w、x的權限,輸出測試結果。
C:將file1、file2兩文件中的小寫字符轉換爲大寫,並將轉換後的內容分別寫入新文件。判斷上述操作成功後分別顯示轉換後的新文件的內容。
D:統計/dev目錄下目錄文件和符號鏈接文件的數目;統計系統中某文本文件中空行的行數;顯示當前系統中所有環境變量。
E:在/dev目錄下查找由s開頭且文件名由5個字符組成的文件,找到後用file命令顯示其文件類型。
#!/bin/bash USER= 'whoami' HOST=`hostname -s` MYDATE=`date +%d/%m/%y` while : do clear cat << MAYDAY ----------------------------------------------------------------- User:$USER Host:$HOST Date:$MYDATE ----------------------------------------------------------------- A:創建子目錄並複製文件 B:文件權限測試 C:文件字符轉換 D:文件總數及文本行數統計 E:文件查找 Q:退出系統 ------------------------------------------------------------------ MAYDAY echo -n "Please Choose [A,B,C,D,E,Q]>" read CHOICE case $CHOICE in A) echo "A:創建子目錄並複製文件" echo "輸入要創建的文件名:" read FILE mkdir $FILE chmod 755 $FILE test -d $FILE if [ $? -eq 0 ] then cp file1 $FILE cp file2 $FILE echo "file1 內容" cat file1 :>$FILE/file1 echo "file2 內容" cat file2 :>$FILE/file2 fi ;; B) echo "B:文件權限測試" echo "請輸入要測試的文件絕對路徑" read NAME1 test -r $NAME1 if [ $? -eq 0 ] then echo "可讀" else echo "不可讀" fi test -w $NAME1 if [ $? -eq 0 ] then echo "可寫" else echo "不可寫" fi test -x $NAME1 if [ $? -eq 0 ] then echo "可執行" else echo "不可執行" fi ;; C) echo "C:文件字符轉換" cat file1 | tr "[a-z]" "[A-Z]" >file1.tr diff -q file1 file1.tr if [ $? -eq 1 ] then echo "file1.tr 內容" cat file1.tr fi cat file2 | tr "[a-z]" "[A-Z]" >file2.tr diff -q file2 file2.tr if [ $? -eq 1 ] then echo "file2.tr 內容" cat file2.tr fi ;; D) echo "/dev 目錄下目錄文件和符號鏈接文件的數目" find /dev -type d | wc -l find /dev -type l | wc -l echo "file1 空行行數統計" grep ^$ file1 | wc -l echo "顯示當前系統中所有環境變量" env ;; E) echo "文件查找" find /dev -name 's????' | xargs file ;; Q) exit 0 ;; *) echo "輸入不符合條件! 請回車後輸入[A.B.C.D.E.Q]" esac read DD done
2.文件pc.txt中保存了三個班級的學生選課成績
試編寫一段shell程序對文件內容進行統計、計算後輸出各個班級選課的學生人數及每班選課成績的優秀率。
pc.txt
文件內容
如下:
Student1: 1301: 75
Student2: 1302: 96
Student3: 1303: 99
Student4: 1302: 93
Student5: 1303: 23
Student6: 1301: 77
#!/bin/bash total1=`grep -F 1301 pc.txt|wc -l` gradeA1=`grep -F 1301 pc.txt|awk -F: '$3 > 90'|wc -l` rateA1=$(($gradeA1*100/$total1)) total2=`grep -F 1302 pc.txt|wc -l` gradeA2=`grep -F 1302 pc.txt|awk -F: '$3 > 90'|wc -l` rateA2=$(($gradeA2*100/$total2)) total3=`grep -F 1303 pc.txt|wc -l` gradeA3=`grep -F 1303 pc.txt|awk -F: '$3 > 90'|wc -l` rateA3=$(($gradeA3*100/$total3)) echo "各班選課人數及優秀率(90及以上爲優秀)" echo "1301班選課人數爲$total1,優秀率爲$rateA1%" echo "1302班選課人數爲$total2,優秀率爲$rateA2%" echo "1303班選課人數爲$total3,優秀率爲$rateA3%"
3.學習、理解find和grep(家族)命令
編制兩個個性化的文件搜索工具。
#!/bin/bash echo "個性化文件搜索工具:" echo "1:grep搜索工具" echo "2:find搜索工具" echo "選擇想要使用的工具[1|2]:" read CHOICE if [ "$CHOICE" == "1" ] #選擇grep then echo "自定義查找" echo "請輸入查找目錄:" read mulu ls $mulu > mulu.txt echo "1:查找以匹配模式開頭的文件" echo "2:查找不包含匹配模式的文件" echo "3:查找以匹配模式結尾並且長度固定的文件" read CHOICE1 case $CHOICE1 in 1)echo "查找以匹配模式開頭的文件" read scanf grep -E ^$scanf mulu.txt ;; 2)echo "查找不包含匹配模式的文件" read scanf grep -Ev $scanf mulu.txt ;; 3)echo "查找以匹配模式結尾並且長度固定的文件" read scanf echo "請輸入長度" read length readlength=$(($length-`echo ${#scanf}`)) grep -xE [[:alnum:]]\{$readlength\}$scanf mulu.txt ;; *) esac else #選擇find echo "自定義查找" echo "請輸入查找目錄:" read mulu2 echo "1:查找文件大小大於給定下限的文件" echo "2:查找給定時間內修改過的文件" echo "3:查找給定文件後綴的文件" read CHOICE2 case $CHOICE2 in 1)echo "請輸入文件大小下限值(k)" read size find $mulu2 -size +$size ;; 2)echo "請輸入時間(day)" read time find $mulu2 -mtime +$time ;; 3)echo "請輸入文件後綴" read houzhui find $mulu2 -name *.$houzhui ;; *) esac fi read DD