shell實例100例《五》

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、題目要求  :   監控流量

寫一個監控網卡的腳本,須要知足如下要求:

  1. 每10分鐘檢測一次指定網卡的流量。

  2. 若是流量爲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

相關文章
相關標籤/搜索