shell腳本練習案例

来源:https://www.cnblogs.com/tui463/archive/2020/04/13/12663024.html
-Advertisement-
Play Games

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 httpd
yum -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 "請輸入用戶名:" user
if [ -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 "請輸入一個整數:" num1
read -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=0
for 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/log
sum=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" = "" ];then
        echo "沒有輸入年份"
        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 "請輸入用戶名:" user
read -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/passwd
cut -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=0
sleeping=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):" JF
if [ $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 "請輸入一個字元:" KEY
case "$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]:" sure
case $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 clear
for ((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=0
while :
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]"

結果

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 在上一篇導出文檔番外篇中,我們已經熟悉了怎樣根據json數據導出word的文檔,生成介面文檔,而在這一篇,將對上一篇進行完善補充,增加多種導出方式,實現更加完善的導出功能。 回顧 1. 獲取Swagger介面文檔的Json文件 2. 解析Json文件數據填充到Html的表格中 3.根據生成的h ...
  • 現如今當你翻看一些開源項目源碼的時候,你會發現現在到處充斥著委托函數,如Func,Action,Predicate,確實現在的C 在函數式編程的路上越來越成為主流,越來越顯示威力,曾經的一些經典設計模式寫法,在函數式下可以稍微優化一下了,這篇我們就來說說模板方法。 一:實際場景 1. 模板方法定義 ...
  • Vim在Linux中是一個簡單卻又強大的文本編輯器,可以用來創建、編輯和查看一個文本。本文只是簡單介紹下,更多用法還得個人多使用練習才行。 Vim通常分為三種模式:命令模式:剛打開Vim時就預設進入命令模式,此時所有的鍵盤敲擊都會被識別為命令而不是字元輸入,而編輯器則處於等待用戶輸入命令的狀態。輸入 ...
  • 本文講一些查看文件內容的常用方法,以及在文件中搜索關鍵字的常用方法,但是註意,這些方法都不能編輯文件內容,編輯文件內容需要vi、vim等編輯器來進行。 註釋在配置文件或shell腳本中,一行中井號#之後的內容為註釋,而不是有效的配置設置或代碼。 cat命令 cat [-n] 文件名:顯示文件內容,但 ...
  • 本文講了一些文件和目錄本身的基礎知識和操作,如新建、複製、移動等,並不涉及文件內容的查看、編輯、搜索等操作。 文件歸屬 文件的歸屬只有三種關係: 所有者u:即文件的擁有者,並且一個文件同時只能有一個所有者,一般是誰創建的文件,這個文件的所有者就是誰。 所屬組g:文件歸屬的組,並且一個文件同時只能歸屬 ...
  • Apple 史上以來最大的bootstrap漏洞 ,已經涉及A7-A10,帶來了全新的 越獄體驗。 工具地址:checkra.in 暫時支持:linux,macos,Windows還在開發中。 ...
  • ubuntu18.04 配置國內鏡像源 修改配置文件 1. 手動更改 用你熟悉的編輯器打開 ,例如 以 為例把下列內容複製替換 中的全部內容( "使用阿裡雲鏡像" ): 2. 一鍵更改 通過 獲取配置文件(前提你的電腦得有wget,沒有的話運行 ),例如獲取ubuntu18.04的配置文件為例( " ...
  • (1)mesh應用背景 (2)mesh 知識簡介 (3)mesh 實現 (4)mesh 總結和不足 author:midu dateTime:20200113 qq:1327706646 關鍵詞: AdHoc :點對點 AP:acess point 接入點 OpenWrt : 開放網路操作系統 OS ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...