Linux SHELL腳本設計

Linux SHELL腳本設計


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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章