4一、題目要求 : 問候腳本mysql
編寫一個問候程序,它執行時能根據系統當前的時間向用戶輸出問候信息。假設從半夜到中午爲早晨,中午到下午六點爲下午,下午六點到半夜爲晚上。linux
#!/bin/bash d=`date +%H` if [ $d -ge 0 -a $d -lt 7 ] then tag=1 elif [ $d -ge 7 -a $d -lt 12 ] then tag=2 elif [ $d -ge 12 -a $d -lt 18 ] then tag=3 else tag=4 fi case $tag in 1) echo "早晨好" ;; 2) echo "上午好" ;; 3) echo "下午好" ;; 4) echo "晚上好" ;; *) echo "腳本出錯啦" ;; esac
實例 :git
執行腳本,查看運行結果,腳本沒有問題。date命令查看系統當前的時間github
注意 : sql
[ $d -ge 0 -a $d -lt 7 ] #大於等於0,小於7shell
[ $d -ge 7 -a $d -lt 12 ] #大於等於7,小於12bash
[ $d -ge 12 -a $d -lt 18 ] #大於等於12,小於18ui
d=`date -d -10 hours +%H` #時間後退10個小時,就變成了腳本執行的結果早上好spa
4二、題目要求 : 菜單腳本操作系統
寫一個shell腳本,實現簡單的彈出式菜單功能,用戶能根據顯示的菜單項從鍵盤選擇執行對應的命令。
#!/bin/bash PS3="Please input your choice(1-4): " select i in w ls pwd quit do case $i in w) w ;; ls) ls ;; pwd) pwd ;; quit) exit ;; *) echo "Please input 1-3." ;; esac done
參考答案2
#!/bin/bash echo -e "1) w\n2) ls\n3) pwd\n4) quit" while : do read -p "Please input your choice(1-4): " c case $c in 1) w ;; 2) ls ;; 3) pwd ;; 4) exit ;; *) echo "Please input 1-4." ;; esac done
實例 :
執行腳本,輸入數字,執行對應的命令。
注意 :
w\n2) ls\n3) pwd\n4) #使用 數字去代替命令w,ls,pwd
4三、題目要求 : 檢查用戶是否登陸
寫一個shell腳本,執行中每隔5分鐘檢查指定的用戶是否登陸系統,用戶名從命令行輸入,若是指定的用戶已經登陸,則顯示相關信息。
#!/bin/bash while : do if w|sed '1'd|awk '{print $1}'|grep -qw "$1" then echo "用戶$1 已經登陸系統." exit fi sleep 300 done
實例 :
查看當前的用戶
執行腳本,輸入用戶名,查看該用戶有沒有登陸。
注意 :
if w|sed '1'd|awk '{print $1}'|grep -qw "$1" #查找並去掉出顯示出來的第一行,
4四、題目要求 : 檢查系統是否入侵
先普及一個小常識,咱們用ps aux能夠查看到進程的PID,而每一個PID都會在/proc內產生。若是查看到的pid在proc內是沒有的,則進程被人修改了,這就表明系統頗有可能已經被入侵過了。 請用上面知識編寫一個shell,按期檢查下本身的系統是否被人入侵過
#!/bin/bash pp=$$ ps -elf |sed '1'd > /tmp/pid.txt for pid in `awk -v ppn=$pp '$5!=ppn {print $4}' /tmp/pid.txt` do if ! [ -d /proc/$pid ] then echo "系統中並無pid爲$pid的目錄,須要檢查。" fi done
實例 :
使用命令ls -l /proc,查看文件的pid,而後經過pid,查看進程。
打印出,含有pid的行
打印出只含有pid的行
注意 :
腳本要把ps、sed、awk中的PID過濾掉,只剩下進程的pid。
ps -elf |sed '1'd > /tmp/pid.txt #列出pid,並刪除第一行,將結果寫入/tmp/pid.txt
for pid in `awk -v ppn=$pp '$5!=ppn {print $4}' /tmp/pid.txt` #awk顯示出來的pid在第四列,把第四列過濾掉;把ps -elf顯示出來的第四列,打印出來。-v : 引用的意思,$5!=ppn {print $4} : $5不等於ppn $4
4五、題目要求 : 三行並一行
想辦法把文本里面每三行內容合併到一行 例如:1.txt內容
1 2 3 4 5 6 7
處理後應該是
1 2 3 4 5 6 7
while read 逐行遍歷
echo -n 不換行
#!/bin/bash n=1 cat $1 |while read line do n1=$[$n%3] if [ $n1 -eq 0 ] then echo "$line" else echo -n "$line " fi n=$[$n+1] done
實例 :
腳本執行結果
注意 :
n1=$[$n%3] #$n可以被3整除
$n1 -eq 0 #-eq等於 0,換行。
4六、題目要求 : 網卡和ip(1)、網卡和ip(2)
寫一個getinterface.sh 腳本能夠接受選項[i,I],完成下面任務:
1)使用格式:getinterface.sh [-i interface | -I ip]
2)當用戶使用-i選項時,顯示指定網卡的IP地址;當用戶使用-I選項時,顯示其指定ip所屬的網卡。
例: sh getinterface.sh -i eth0 或者
sh getinterface.sh -I 192.168.0.1
3)當用戶使用除[-i | -I]選項時,顯示[-i interface | -I ip]此信息。
4)當用戶指定信息不符合時,顯示錯誤。(好比指定的eth0沒有,而是eth1時)
【核心要點】
兩個參數$1只能是-i或者-I , $2只能是網卡名字或者IP地址
把網卡名字和IP地址寫到一個臨時文件裏備用
#!/bin/bash ip add |awk -F ': ' '$1 ~ "^[1-9]" {print $2}' > /tmp/ifs.txt get_ip() { ip add show dev $1 |grep inet |awk '{print $2}' |awk -F '/' '{print $1}' } for eth in `cat /tmp/ifs.txt` do myip=`get_ip $eth` if [ -z "$myip" ] then echo $eth else echo $eth $myip fi done > /tmp/if_ip.txt if [ $# -ne 2 ] then echo "請輸入正確的格式: bash $0 -i 網卡 或者 bash $0 -I ip" exit fi if [ $1 == "-i" ] then if awk '{print $1}' /tmp/if_ip.txt |grep -qw $2 then eth=$2 ip1=`awk -v aeth=$eth '$1==aeth' /tmp/if_ip.txt|sed "s/$eth //"` echo "網卡$2的ip是 $ip1" else echo "你指定的網卡不對,系統中的網卡有:`cat /tmp/ifs.txt|xargs`" exit fi elif [ $1 == "-I" ] then if grep -qw " $2 " /tmp/if_ip.txt then eth=`grep -w " $2 " /tmp/if_ip.txt|awk '{print $1}'` echo "IP $2對應的網卡是$eth" else echo "你指定的ip不對,系統中的IP有:`ip add |grep inet |awk '{print $2}'|awk -F '/' '{print $1}'|xargs`" exit fi else echo "請輸入正確的格式: bash $0 -i 網卡 或者 bash $0 -I ip" fi
實例 :
查看系統中有哪些網卡
查看lo網卡第二行
注意 :
ip add |awk -F ': ' '$1 ~ "^[1-9]" {print $2}' > /tmp/ifs.txt #將網卡和網卡IP對應的關係,寫入到 /tmp/ifs.txt 文件中
ip add show dev $1 |grep inet |awk '{print $2}' |awk -F '/' '{print $1}' #只顯示網卡的IP地址。
if awk '{print $1}' /tmp/if_ip.txt |grep -qw $2 #
if [ -z "$myip" ] #若是這個變量爲空,
4七、題目要求 : 隨機3位數
寫一個腳本產生隨機3位的數字,而且能夠根據用戶的輸入參數來判斷輸出幾組。 好比,腳本名字爲 number3.sh。
執行方法:
1)bash number3.sh 會產生一組3位數字。
2)bash number3.sh 10 會產生10組3位數字。
#!/bin/bash get_number() { for i in `seq 0 2` do a[$i]=$[$RANDOM%10] done echo ${a[@]}|sed s'/ //g' } if [ $# -eq 0 ] then get_number elif [ $# -eq 1 ] then n=`echo $1|sed 's/[0-9]//g'` if [ -n "$n" ] then echo "給定的參數必須是一個數字" exit fi for i in `seq 1 $1` do get_number done |xargs else echo "格式不對,正確的是格式是sh $0 [n],這裏的n是一個數字。" fi
實例 :
腳本運行結果
注意 :
if [ -n "$n" ] #若是-n不爲空,說明「給定的參數必須是一個數字」
elif [ $# -eq 1 ] #eq 等於1
4八、題目要求 : 是否安裝包
寫一個shell,先判斷是否安裝httpd和mysql,沒有安裝進行安裝,安裝了檢查是否啓動服務,若沒有啓動則須要啓動服務。
說明 :操做系統爲cnetos6,httpd和mysql所有爲rpm包安裝
【核心要點】
rpm -q 包名 判斷是否安裝
service xxx start #啓動
#!/bin/bash if_install() { rpm -q $1 >/dev/null 2>/dev/null if [ $? -eq 0 ] then echo "$1已經安裝" return 0 else echo "$1沒有安裝" return 1 fi } if_install httpd if [ $? -eq 0 ] then if ! pgrep httpd >/dev/null then service httpd start fi else yum install -y httpd fi if_install mysql-server if [ $? -eq 0 ] then if ! pgrep mysqld >/dev/null then service mysqld start fi else yum install -y mysql-server fi
實例 :
查看軟件是否安裝
腳本執行的過程
注意 :
rpm -q $1 >/dev/null 2>/dev/null #判斷是否安裝,若是安裝寫入/dev/null,未安裝;$1就是包名
4九、題目要求 : 日期是否合法
用shell腳本判斷輸入的日期是否合法。
好比20170110就是合法日期,20171332就不合法。
#!/bin/bash if [ $# -ne 1 ] || [ ${#1} -ne 8 ] then echo "請輸入正確的格式,sh $0 yyyymmdd" exit 1 fi y=`echo ${1:0:4}` m=`echo ${1:4:2}` d=`echo ${1:6:2}` if echo $d|grep -q "^0" then d=`echo ${1:6:2}|sed 's/^0//'` fi if cal $m $y >/dev/null 2>/dev/null then if ! cal $m $y|grep -qw "$d" then echo "你給的日期是不合法的" else echo "日期合法" fi else echo "你給的日期不合法" fi
實例 :
查看系統時間,月和年。
修改系統時間爲指定的時間
取前三個,取前四個
腳本執行的結果
注意 :
if [ $# -ne 1 ] || [ ${#1} -ne 8 ] # $#不等於1 或者 ${#1} 不等於8,提示 : 「請輸入正確的格式,sh $0 yyyymmdd」
if echo $d|grep -q "^0" #查找不以0開頭的
if ! cal $m $y|grep -qw "$d" #
if cal $m $y >/dev/null 2>/dev/null #日曆月和年,正確和錯誤都輸入到/dev/null
50、題目要求 : 監控流量
寫一個監控網卡的腳本,須要知足如下要求:
每10分鐘檢測一次指定網卡的流量。
若是流量爲0,則重啓網卡。
【核心要點】
sar -n DEV # 查看dev網卡的流量
ifdown xxx; ifup xxx #下載的速度,和上傳的速度
#!/bin/bash LANG=en sar -n DEV 1 10|grep -w "$1" > /tmp/sar.tmp in=`grep "Average:" /tmp/sar.tmp|awk '{print $5}'|sed 's/\.//'` out=`grep "Average:" /tmp/sar.tmp|awk '{print $6}'|sed 's/\.//'` if [ $in == "000" ] && [ $out == "000" ] then ifdown $1 ifup $1 fi
實例 :
10秒一次網卡流量監測
查看lo網卡的流量,10秒一次網卡流量監測,average爲0時,須要重啓網卡。
腳本執行的結果
注意 :
sar -n DEV 1 10|grep -w "$1" > /tmp/sar.tmp #把網卡流量的每10秒統計一次的結果的第一行,寫入到 /tmp/sar.tmp
in=`grep "Average:" /tmp/sar.tmp|awk '{print $5}'|sed 's/\.//'` #進入的流量的第五行,輸入到/tmp/sar.tmp,去掉前面的小數點。
out=`grep "Average:" /tmp/sar.tmp|awk '{print $6}'|sed 's/\.//'` #輸出的流量的第六行,輸入到/tmp/sar.tmp,去掉前面的小數點。
if [ $in == "000" ] && [ $out == "000" ] #當進入的和輸出的,都爲0時,重啓網卡。
來源 :https://github.com/aminglinux/shell100/blob/master/13.md