shell腳本練習案例 案例一:通過位置變數創建系統賬戶及密碼 分析 (1)通過位置變數創建 Linux 系統賬戶及密碼 (2)創建用戶,111為第一個變數 (3)為用戶設置密碼,123456為第二個變數 實現 #!/bin/bash useradd "111"echo "123456" | pas ...
shell腳本練習案例
案例一:通過位置變數創建系統賬戶及密碼
分析
(1)通過位置變數創建 Linux 系統賬戶及密碼
(2)創建用戶,111為第一個變數
(3)為用戶設置密碼,123456為第二個變數
實現
#!/bin/bash useradd "111"echo "123456" | passwd --stdin "111"
結果
案例二:一鍵部署 LNMP(RPM 包版本)
分析
(1)安裝服務
(2)啟動服務
(3)查看啟動狀態
實現
#!/bin/bash yum -y install httpdyum -y install mariadb mariadb-devel mariadb-server
yum -y install php php-mysql systemctl start httpd mariadb
systemctl enable httpd mariadb
結果
案例三:監控記憶體和磁碟容量
分析
(1)實時監控本機記憶體和硬碟剩餘空間
(2)提取根分區剩餘空間
(3)提取記憶體剩餘空間 (4)剩餘記憶體小於500M、根分區剩餘空間小於1000M時,發送報警郵件給root管理員實現
#!/bin/bash disk_size=$(df / | awk '/\//{print $4}')mem_size=$(free | awk '/Mem/{print $4}')
while :
do
if [ $disk_size -le 512000 -a $mem_size -le 1024000 ]
then
mail -s "Warning" root <<EOF
Insufficient resources,資源不足
EOF
fi
done
案例四:猜數字游戲
分析
(1)腳本生成一個100以內的隨機數
(2)根據用戶的輸入,提示猜大了或者猜小了,直到用戶猜對
(3)使用read提示用戶猜數字
(4)使用if判斷用戶猜的數字
實現
#!/bin/bash num=$[RANDOM%100+1]echo "$num" while :
do
read -p "電腦生成了一個1-100的隨機數,你猜:" cai
if [ $cai -eq $num ]
then
echo "恭喜,猜對了"
exit
elif [ $cai -gt $num ]
then
echo "Oops,猜大了"
else
echo "Oops,猜小了"
fi
done
結果

案例五:檢測本機當前用戶是否為超級管理員
分析
(1)如果是管理員,則使用 yum 安裝 vsftpd
(2)如果不是,則提示您非管理員
實現
#!/bin/bash if [ $USER == "root" ]then
yum -y install vsftpd
else
echo "您不是管理員,沒有許可權安裝軟體"
fi
案例六:創建用戶
分析
(1)提示用戶輸入用戶名和密碼,腳本自動創建相應的賬戶及配置密碼
(2)如果用戶不輸入賬戶名,則提示必須輸入賬戶名並退出腳本
(3)如果用戶不輸入密碼,則統一使用預設的 123456 作為預設密碼
實現
#!/bin/bash read -p "請輸入用戶名:" userif [ -z $user ];then
echo "您不需輸入賬戶名"
exit 2
fi
stty -echo
read -p "請輸入密碼:" pass
stty echo
pass=${pass:-123456}
useradd "$user"
echo "$pass" | passwd --stdin "$user"
結果
案例七:輸入三個數併進行升序排列
分析
(1)依次提示用戶輸入 3 個整數,腳本根據數字大小依次排序輸出 3 個數字 (2)不管誰大誰小,最後都列印 echo "$num1,$num2,$num3" (3)num1 中永遠存最小的值,num2 中永遠存中間值,num3 永遠存最大值 (4)如果 num1 大於 num2,就把 num1 和和 num2 的值對調,確保 num1 變數中存的是最小值 (5)如果 num1 大於 num3,就把 num1 和 num3 對調,確保 num1 變數中存的是最小值 (6)如果 num2 大於 num3,就把 num2 和 num3 對標,確保 num2 變數中存的是小一點的值實現
#!/bin/bash read -p "請輸入一個整數:" num1read -p "請輸入一個整數:" num2
read -p "請輸入一個整數:" num3
tmp=0
if [ $num1 -gt $num2 ];then
tmp=$num1
num1=$num2
num2=$tmp
fi
if [ $num1 -gt $num3 ];then
tmp=$num1
num1=$num3
num3=$tmp
fi
if [ $num2 -gt $num3 ];then
tmp=$num2
num2=$num3
num3=$tmp
fi
echo "排序後數據(從小到大)為:$num1,$num2,$num3"
結果
案例八:石頭剪刀布游戲
分析
通過隨機數獲取電腦的出拳
實現
#!/bin/bash game=(石頭 剪刀 布)num=$[RANDOM%3]
computer=${game[$num]} echo "請根據下列提示選擇您的出拳手勢"
echo "1.石頭"
echo "2.剪刀"
echo "3.布" read -p "請選擇 1-3:" person
case $person in
1)
if [ $num -eq 0 ]
then
echo "平局"
elif [ $num -eq 1 ]
then
echo "你贏"
else
echo "電腦贏"
fi;;
2)
if [ $num -eq 0 ]
then
echo "電腦贏"
elif [ $num -eq 1 ]
then
echo "平局"
else
echo "你贏"
fi;;
3)
if [ $num -eq 0 ]
then
echo "你贏"
elif [ $num -eq 1 ]
then
echo "電腦贏"
else
echo "平局"
fi;;
*)
echo "必須輸入1-3的數字"
esac
結果

案例九:進度條
分析
(1)定義一個顯示進度的函數,屏幕快速顯示 | / - \
(2)設置4個形狀的編號,預設編號為0
(3)執行迴圈,COUNT每次迴圈加1
(4)判斷COUNT的值,值不一樣顯示的形狀就不一樣
實現
#!/bin/bash rotate_line(){INTERVAL=0.5
COUNT="0"
while :
do
COUNT=`expr $COUNT + 1`
case $COUNT in
"1")
echo -e '-'"\b\c"
sleep $INTERVAL
;;
"2")
echo -e '\\'"\b\c"
sleep $INTERVAL
;;
"3")
echo -e "|\b\c"
sleep $INTERVAL
;;
"4")
echo -e "/\b\c"
sleep $INTERVAL
;;
*)
COUNT="0";;
esac
done
}
rotate_line
結果
動態顯示時針
案例十:乘法表
實現
#!/bin/bash for i in `seq 9`do
for j in `seq $i`
do
echo -n "$j*$i=$[i*j] "
done
echo
done
結果
案例十一: 實時顯示數據包流量
分析
使用死迴圈實時顯示 eth0 網卡發送的數據包流量
實現
#!/bin/bash while :do
echo '本地網卡eth0流量信息如下:'
ifconfig eth0 | grep "RX pack" | awk '{print $5}'
ifconfig eth0 | grep "TX pack" | awk '{print $5}'
sleep 1
done
結果
案例十二: 點名器腳本
分析
(1)提前準備一個user.txt文件
(2)文件中需要包含所有姓名的信息,一行一個姓名,腳本每次隨機顯示一個姓名
實現
#!/bin/bash while :do
line=`cat user.txt | wc -l`
num=$[RANDOM%line+1]
sed -n "${num}p" user.txt
sleep 0.2
clear
done
結果
案例十三:100以內的所有正整數相加求和
分析
(1)對 100 以內的所有正整數相加求和(1+2+3+4...+100)
(2)seq 100 可以快速自動生成100個整數
實現
#! /bin/bash sum=0for i in `seq 100`
do
sum=$[sum+i]
done
echo "總和是:$sum"
結果
案例十四: 列印國際象棋棋盤
分析
(1)設置兩個變數,i和j,一個代表行,一個代表列
(2)i=1 代表準備第一行棋盤,第一行棋盤有灰色和藍色間隔輸出
(3)棋盤的規律是i+j,如果是偶數,就列印藍色色塊,是基數就列印灰色色塊
(4)列印完成色塊後不自動換行,在同一行繼續輸出其他色塊
實現
#!/bin/bash for i in {1..8}do
for j in {1..8}
do
sum=$[i+j]
if [ $[sum%2] -eq 0 ];then
echo -ne "\033[46m \033[0m"
else
echo -ne "\033[47m \033[0m"
fi
done
echo
done
結果
案例十五: 統計文件個數並顯示文件名
分析
(1)統計/var/log 有多少個文件,並顯示這些文件名
(2)使用ls遞歸顯示所有,再判斷是否為文件
實現
#!/bin/bash cd /var/logsum=0
for i in `ls -r *`
do
if [ -f $i ];then
let sum++
echo "文件名:$i"
fi
done
echo "總文件數量為:$sum"
結果
案例十六: 查找僵屍進程
分析
(1)查找 Linux 系統中的僵屍進程
(2)awk判斷ps命令輸出的第八列為Z,顯示該進程的PID和進程命令
實現
#!/bin/bash ps aux | awk '{if($8 == "Z"){print $2,$11}}'案例十七:判斷年份是否為閏年
分析
(1)提示用戶輸入年份後判斷該年是否為閏年
(2)能被4整除並且不能被100整除的年份是閏年
(3)能被400整除的年份也是閏年
實現
#!/bin/bash read -p "請輸入一個年份:" year if [ "$year" = "" ];thenecho "沒有輸入年份"
exit
fi if [[ "$year" =~ [a-Z] ]];then
echo "你輸入的不是數字"
exit
fi if [ $[year % 4] -eq 0 ] && [ $[year % 100] -ne 0 ];then
echo "$year年是閏年"
elif [ $[year % 400] -eq 0 ];then
echo "$year年是閏年"
else
echo "$year年不是閏年"
fi
結果
案例十八: 測試用戶名和密碼是否正確
分析
(1)測試用戶名與密碼是否正確
(2)用戶名為tom並且密碼為123456,提示登錄成功,否則提示登錄失敗
實現
#!/bin/bash read -p "請輸入用戶名:" userread -p "請輸入密碼:" pass
if [ "$user" == 'tom' -a "$pass" == '123456' ];then
echo "Login successful"
else
echo "Login Failed"
fi
結果
案例十九:迴圈測試用戶名和密碼是否正確
分析
(1)迴圈測試用戶名與密碼是否正確
(2)最多測試三次,輸入正確提示登陸成功,否則提示登陸失敗
(3)用戶名為tom,密碼為123456
實現
#!/bin/bash for i in {1..3}do
read -p "請輸入用戶名:" user
read -p "請輸入密碼:" pass
if [ "$user" == 'tom' -a "$pass" == '123456' ];then
echo "Login successful"
exit
fi
done
echo "Login Failed"
結果
案例二十:顯示用戶名稱
分析
(1)顯示當前電腦中所有賬戶的用戶名稱
(2)指定以:為分隔符,列印文件的第一列
(3)使用sed的替換功能,將文件中:後面的所有內容替換為空
實現
#!/bin/bash awk -F: '{print $1}' /etc/passwdcut -d: -f1 /etc/passwd
sed 's/:.*//' /etc/passwd
結果
案例二十一:顯示迴旋鏢進度
分析
(1)先從第一個到第二十個符號
(2)再從第二十個回到第一個符號
(3)時間間隔為0.1秒
實現
#!/bin/bash while :do
clear
for i in {1..20}
do
echo -e "\033[3;${i}H*"
sleep 0.1
done
clear
for i in {20..1}
do
echo -e "\033[3;${i}H*"
sleep 0.1
done
clear
done
案例二十二:統計進程相關數量信息
分析
(1)統計Linux進程相關數量信息 (2)在proc目錄下所有以數字開始的都是當前電腦正在運行的進程的PID (3)每個PID編號的目錄下記錄有該進程相關的信息 (4)每個PID目錄下都有一個stat文件,該文件的第三列是該進程的狀態信息實現
#!/bin/bash running=0sleeping=0
stoped=0
zombie=0 for pid in /proc/[1-9]*
do
procs=$[procs +1]
stat=$(awk '{print $3}' $pid/stat)
case $stat in
R)
running=$[running+1]
;;
T)
stoped=$[stoped+1]
;;
S)
sleeping=$[sleeping+1]
;;
Z)
zombie=$[zombie+1]
;;
esac
done
echo "進程統計信息如下"
echo "總進程數量為:$procs"
echo "Running進程數為:$running"
echo "Stoped進程數為:$stoped"
echo "Sleeping進程數為:$sleeping"
echo "Zombie進程數為:$zombie"
結果
案例二十三:判斷用戶等級
分析
(1)從鍵盤讀取一個論壇積分,判斷論壇用戶等級
(2)根據等級分類
實現
#!/bin/bash read -p "請輸入積分(0-100):" JFif [ $JF -ge 90 ];then
echo "$JF分,神功絕世"
elif [ $JF -ge 80 ];then
echo "$JF分,登峰造極"
elif [ $JF -ge 70 ];then
echo "$JF分,爐火純青"
elif [ $JF -ge 60 ];then
echo "$JF分,略有小成"
else
echo "$JF分,初學乍練"
fi
結果

案例二十四:判讀輸入的數據類型
分析
判斷用戶輸入的數據類型,字母數字或其他
實現
#!/bin/bash read -p "請輸入一個字元:" KEYcase "$KEY" in
[a-z]|[A-Z])
echo "字母"
;;
[0-9])
echo "數字"
;;
*)
echo "空格、功能鍵或其他控制字元"
esac
結果

案例二十五:列印斐波那契數列
分析
(1)該數列的特點是後一個數字永遠是前2個數字之和
(2)如:0 1 1 2 3 5 8 13 ........
實現
#!/bin/bash list=(0 1)
for i in `seq 2 11`
do
list[$i]=`expr ${list[-1]} + ${list[-2]}`
done
echo ${list[@]}
結果
案例二十六: 判斷輸入的是否
分析
(1)當輸入y、Y、Yes、YES時顯示你選擇女孩
(2)當輸入n、N、NO、no時顯示你選擇男孩
(3)當輸入其他時候顯示失敗
實現
#!/bin/bash read -p "Are you sure?[y/n]:" surecase $sure in
y|Y|Yes|YES)
echo "you enter girl"
;;
n|N|NO|no)
echo "you enter boy"
;;
*)
echo "error";;
esac
結果
案例二十七:列印圖形
分析
(1)使用shell腳本列印圖形
(2)for (()) 為類C語言的語法格式
實現
#!/bin/bash clearfor ((i=1;i<=9;i++))
do
for ((j=1;j<=i;j++))
do
echo -n "$i"
done
echo ""
done
read -n1 "按任意鍵繼續" key
clear
for ((i=1;i<=5;i++))
do
for ((j=1;j<=i;j++))
do
echo -n " |"
done
echo "_ "
done
read -n1 "按任意鍵繼續" key
clear
for ((i=1;i<=5;i++))
do
for ((j=1;j<=i;j++))
do
echo -n " *"
done
echo ""
done
for ((i=5;i>=1;i--))
do
for ((j=1;j<=i;j++))
do
echo -n " *"
done
echo ""
done
結果
案例二十八:根據時間返回問候語
分析
(1)根據電腦當前時間,返回問候語
(2)00-12點為早晨,12-18點為下午,18-24為晚上
(3)使用date命令獲取時間
(4)if判斷時間的區間,確定問候語內容實現
#!/bin/bash tm=$(date +%H)if [ $tm -le 12 ];then
msg="上午好美女"
elif [ $tm -gt 12 -a $tm -le 18 ];then
msg="下午好美女"
else
msg="晚上好美女"
fi
echo "當前時間是:$(date +"%Y-%m-%d %H:%M:%S")"
echo -e "\033[34m$msg\033[0m"
結果
案例二十九:將賬戶寫入數組保存
分析
(1)讀取用戶輸入的賬戶名稱,將賬戶名寫入到數組保存
(2)定義數組名稱為name
(3)數組的下標為i,小標從0開始,每輸入一個賬戶名,下標加1,繼續存下一個
(4)最後輸入over,腳本輸出總結性信息後腳本退出
實現
#!/bin/bash i=0while :
do
read -p "請輸入賬戶名,輸入over結束:" key
if [ $key == "over" ];then
break
else
name[$i]=$key
let i++
fi
done
echo "總帳戶名數量:${#name[*]}"
echo "${name[@]}"
結果
案例三十: 計算兩個整數的和差積商
分析
傳遞兩個整數給腳本,讓腳本分別計算並顯示這兩個整數的和,差,積,商
實現
#!/bin/bash echo "first number $1"echo "second number $2"
echo "$(($1+$2))"
echo "$[$1-$2]"
echo "$[$1*$2]"
echo "$[$1/$2]"
結果