天天看點

運維常用的35個Linux Shell 腳本,有你熟悉的沒

作為一名 Linux 工程師,會寫好的腳本不僅能提高工作效率,還能有更多的時間做自己的事。最近在網上沖浪的時候,也注意收集一些大佬寫過的腳本,彙總整理一下,歡迎收藏,與君共勉!

(1)使用者猜數字

#!/bin/bash




# 腳本生成一個 100 以内的随機數,提示使用者猜數字,根據使用者的輸入,提示使用者猜對了,

# 猜小了或猜大了,直至使用者猜對腳本結束。




# RANDOM 為系統自帶的系統變量,值為 0‐32767的随機數

# 使用取餘算法将随機數變為 1‐100 的随機數

num=$[RANDOM%100+1]

echo "$num"




# 使用 read 提示使用者猜數字

# 使用 if 判斷使用者猜數字的大小關系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于),

# ‐lt(小于),‐le(小于等于)

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           

(2)檢視有多少遠端的 IP 在連接配接本機

#!/bin/bash




#!/bin/bash

# 檢視有多少遠端的 IP 在連接配接本機(不管是通過 ssh 還是 web 還是 ftp 都統計) 




# 使用 netstat ‐atn 可以檢視本機所有連接配接的狀态,‐a 檢視所有,

# -t僅顯示 tcp 連接配接的資訊,‐n 數字格式顯示

# Local Address(第四列是本機的 IP 和端口資訊)

# Foreign Address(第五列是遠端主機的 IP 和端口資訊)

# 使用 awk 指令僅顯示第 5 列資料,再顯示第 1 列 IP 位址的資訊

# sort 可以按數字大小排序,最後使用 uniq 将多餘重複的删除,并統計重複的次數

netstat -atn  |  awk  '{print $5}'  | awk  '{print $1}' | sort -nr  |  uniq -c           

(3)helloworld

#!/bin/bash




function example {

echo "Hello world!"

}

example           

(4)列印 tomcat 的pid

#!/bin/sh`




v1="Hello"

v2="world"

v3=${v1}${v2}

echo $v3




pidlist=`ps -ef|grep apache-tomcat-7.0.75|grep -v "grep"|awk '{print $2}'`

echo $pidlist

echo "tomcat Id list :$pidlist"  //顯示pid           

(5)腳本編寫 剪刀 、 石頭、布遊戲

#!/bin/bash




game=(石頭 剪刀 布)

num=$[RANDOM%3]

computer=${game[$sum]}




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           

(6)九九乘法表

#!/bin/bash




for i in `seq 9`

do 

 for j in `seq $i`

 do 

 echo -n "$j*$i=$[i*j] "

 done

    echo

done           

(7)腳本用源碼來安裝 memcached 伺服器

#!/bin/bash

# 一鍵部署 memcached 




# 腳本用源碼來安裝 memcached 伺服器

# 注意:如果軟體的下載下傳連結過期了,請更新 memcached 的下載下傳連結

wget http://www.memcached.org/files/memcached-1.5.1.tar.gz

yum -y install gcc

tar -xf  memcached‐1.5.1.tar.gz

cd memcached‐1.5.1

./configure

make

make install           

(8)檢測本機目前使用者是否為超級管理者

#!/bin/bash




# 檢測本機目前使用者是否為超級管理者,如果是管理者,則使用 yum 安裝 vsftpd,如果不

# 是,則提示您非管理者(使用字串對比版本) 

if [ $USER == "root" ] 

then 

 yum -y install vsftpd

else 

 echo "您不是管理者,沒有權限安裝軟體"

fi           

(9)if 運算表達式

#!/bin/bash -xv


if [ $1 -eq 2 ] ;then
 echo "wo ai wenmin"
elif [ $1 -eq 3 ] ;then 
 echo "wo ai wenxing "
elif [ $1 -eq 4 ] ;then 
 echo "wo de xin "
elif [ $1 -eq 5 ] ;then
 echo "wo de ai "
fi           

(11)腳本 殺掉 tomcat 程序并重新啟動

#!/bin/bash




#kill tomcat pid




pidlist=`ps -ef|grep apache-tomcat-7.0.75|grep -v "grep"|awk '{print $2}'`  #找到tomcat的PID号




echo "tomcat Id list :$pidlist"  //顯示pid




kill -9 $pidlist  #殺掉改程序




echo "KILL $pidlist:" //提示程序以及被殺掉




echo "service stop success"




echo "start tomcat"




cd /opt/apache-tomcat-7.0.75




pwd 




rm -rf work/*




cd bin




./startup.sh #;tail -f ../logs/catalina.out           

(12)列印國際象棋棋盤

#!/bin/bash
# 列印國際象棋棋盤
# 設定兩個變量,i 和 j,一個代表行,一個代表列,國際象棋為 8*8 棋盤
# i=1 是代表準備列印第一行棋盤,第 1 行棋盤有灰色和藍色間隔輸出,總共為 8 列
# i=1,j=1 代表第 1 行的第 1 列;i=2,j=3 代表第 2 行的第 3 列
# 棋盤的規律是 i+j 如果是偶數,就列印藍色色塊,如果是奇數就列印灰色色塊
# 使用 echo ‐ne 列印色塊,并且列印完成色塊後不自動換行,在同一行繼續輸出其他色塊
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

           

(13)統計目前 Linux 系統中可以登入計算機的賬戶有多少個

#!/bin/bash




# 統計目前 Linux 系統中可以登入計算機的賬戶有多少個

#方法 1:

grep "bash#34; /etc/passwd | wc -l

#方法 2:

awk -f : '/bash$/{x++}end{print x}' /etc/passwd           

(14)備份 MySQL 表資料

#!/bin/sh




source /etc/profile

dbName=mysql

tableName=db

echo [`date +'%Y-%m-%d %H:%M:%S'`]' start loading data...'

mysql -uroot -proot -P3306 ${dbName} -e "LOAD DATA LOCAL INFILE '# /home/wenmin/wenxing.txt' INTO TABLE ${tableName} FIELDS TERMINATED BY ';'"

echo [`date +'%Y-%m-%d %H:%M:%S'`]' end loading data...'

exit

EOF           

(15)使用死循環實時顯示 eth0 網卡發送的資料包流量

#!/bin/bash




# 使用死循環實時顯示 eth0 網卡發送的資料包流量 




while :

do 

 echo '本地網卡 ens33 流量資訊如下:'

 ifconfig ens33 | grep "RX pack" | awk '{print $5}'

     ifconfig ens33 | grep "TX pack" | awk '{print $5}'

 sleep 1

done           

(16)編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處于開機狀态,哪些主機處于關機

#!/bin/bash




# 編寫腳本測試 192.168.4.0/24 整個網段中哪些主機處于開機狀态,哪些主機處于關機

# 狀态(for 版本)

for i in {1..254}

do 

 # 每隔0.3秒ping一次,一共ping2次,并以1毫秒為機關設定ping的逾時時間

 ping -c 2 -i 0.3 -W 1 192.168.1.$i &>/dev/null

     if [ $? -eq 0 ];then

 echo "192.168.1.$i is up"

 else 

 echo "192.168.1.$i is down"

 fi

done           

(17)編寫腳本:提示使用者輸入使用者名和密碼,腳本自動建立相應的賬戶及配置密碼。如果使用者

#!/bin/bash

# 編寫腳本:提示使用者輸入使用者名和密碼,腳本自動建立相應的賬戶及配置密碼。如果使用者

# 不輸入賬戶名,則提示必須輸入賬戶名并退出腳本;如果使用者不輸入密碼,則統一使用默

# 認的 123456 作為預設密碼。




read -p "請輸入使用者名:" user

#使用‐z 可以判斷一個變量是否為空,如果為空,提示使用者必須輸入賬戶名,并退出腳本,退出碼為 2

#沒有輸入使用者名腳本退出後,使用$?檢視的傳回碼為 2

if [ -z $user ]; then

 echo " 您不需要輸入賬戶名" 

 exit 2

fi 

#使用 stty ‐echo 關閉 shell 的回顯功能

#使用 stty  echo 打開 shell 的回顯功能

stty -echo 

read -p "請輸入密碼:" pass

stty echo 

pass=${pass:-123456}

useradd "$user"

echo "$pass" | passwd --stdin "$user"           

(18)使用腳本對輸入的三個整數進行排序

#!/bin/bash




# 依次提示使用者輸入 3 個整數,腳本根據數字大小依次排序輸出 3 個數字

read -p " 請輸入一個整數:" num1

read -p " 請輸入一個整數:" num2

read -p " 請輸入一個整數:  " num3




# 不管誰大誰小,最後都列印 echo "$num1,$num2,$num3"

# num1 中永遠存最小的值,num2 中永遠存中間值,num3 永遠存最大值

# 如果輸入的不是這樣的順序,則改變數的存儲順序,如:可以将 num1 和 num2 的值對調

tmp=0

# 如果 num1 大于 num2,就把 num1 和和 num2 的值對調,確定 num1 變量中存的是最小值

if [ $num1 -gt $num2 ];then

 tmp=$num1

 num1=$num2

 num2=tmp

fi

# 如果 num1 大于 num3,就把 num1 和 num3 對調,確定 num1 變量中存的是最小值

if [ $num1 -gt $num3 ];then

 tmp=$num1

 num1=$num3

 num3=$tmp

fi

# 如果 num2 大于 num3,就把 num2 和 num3 對調,確定 num2 變量中存的是最小值

if [ $num2 -gt $num3 ];then

 tmp=$num2

 num2=$num3

 num3=$tmp

fi

echo "排序後資料(從小到大)為:$num1,$num2,$num3"           

(19)根據計算機目前時間,傳回問候語,可以将該腳本設定為開機啟動

#!/bin/bash

# 根據計算機目前時間,傳回問候語,可以将該腳本設定為開機啟動 




# 00‐12 點為早晨,12‐18 點為下午,18‐24 點為晚上

# 使用 date 指令擷取時間後,if 判斷時間的區間,确定問候語内容

tm=$(date +%H)

if [ $tm -le 12 ];then

 msg="Good Morning $USER"

elif [ $tm -gt 12 -a $tm -le 18 ];then

   msg="Good Afternoon $USER"

else

   msg="Good Night $USER"

fi

echo "目前時間是:$(date +"%Y‐%m‐%d %H:%M:%S")"

echo -e "\033[34m$msg\033[0m"           

(20)将 I lov cls 寫入到 txt 檔案中

#!/bin/bash




cd /home/wenmin/

touch wenxing.txt

echo "I lov cls" >>wenxing.txt           

(21)腳本編寫 for 循環判斷

#!/bin/bash




s=0;

for((i=1;i<100;i++))

do 

 s=$[$s+$i]

done 




echo $s




r=0;

a=0;

b=0;

for((x=1;x<9;x++))

do 

 a=$[$a+$x] 

echo $x

done

for((y=1;y<9;y++))

do 

 b=$[$b+$y]

echo $y




done




echo $r=$[$a+$b]           

(22)腳本編寫 for 循環判斷

#!/bin/bash




for i in "$*"

do 

 echo "wenmin xihuan $i"

done




for j in "$@"

do 

 echo "wenmin xihuan $j"

done           

(23)腳本 每周 5 使用 tar 指令備份/var/log 下的所有日志檔案

#!/bin/bash

# 每周 5 使用 tar 指令備份/var/log 下的所有日志檔案

# vim  /root/logbak.sh

# 編寫備份腳本,備份後的檔案名包含日期标簽,防止後面的備份将前面的備份資料覆寫

# 注意 date 指令需要使用反引号括起來,反引号在鍵盤<tab>鍵上面




tar -czf log-`date +%Y%m%d`.tar.gz /var/log 




# crontab -e #編寫計劃任務,執行備份腳本

00 03 * * 5 /home/wenmin/datas/logbak.sh           

(24)腳本編寫 求和 函數運算 function xx()

#!/bin/bash




function sum()

{

 s=0;

 s=$[$1+$2]

 echo $s

}

read -p "input your parameter " p1

read -p "input your parameter " p2




sum $p1 $p2




function multi()

{

 r=0;

 r=$[$1/$2]

 echo $r

}

read -p "input your parameter " x1

read -p "input your parameter " x2




multi $x1 $x2




v1=1

v2=2

let v3=$v1+$v2

echo $v3           

(25)腳本編寫 case — esac 分支結構表達式

#!/bin/bash 




case $1 in 

1) 

 echo "wenmin "

;;

2)

 echo "wenxing "

;; 

3)  

 echo "wemchang "

;;

4) 

 echo "yijun"

;;

5)

 echo "sinian"

;;

6)  

 echo "sikeng"

;;

7) 

 echo "yanna"

;;

*)

 echo "danlian"

;; 

esac           

(26)# 定義要監控的頁面位址,對 tomcat 狀态進行重新開機或維護

#!/bin/sh  

# function:自動監控tomcat程序,挂了就執行重新開機操作  

# author:huanghong  

# DEFINE  




# 擷取tomcat PPID  

TomcatID=$(ps -ef |grep tomcat |grep -w 'apache-tomcat-7.0.75'|grep -v 'grep'|awk '{print $2}')  




# tomcat_startup  

StartTomcat=/opt/apache-tomcat-7.0.75/bin/startup.sh  







#TomcatCache=/usr/apache-tomcat-5.5.23/work  




# 定義要監控的頁面位址  

WebUrl=http://192.168.254.118:8080/




# 日志輸出  

GetPageInfo=/dev/null  

TomcatMonitorLog=/tmp/TomcatMonitor.log  




Monitor()  

  {  

   echo "[info]開始監控tomcat...[$(date +'%F %H:%M:%S')]"  

   if [ $TomcatID ]

 then  

      echo "[info]tomcat程序ID為:$TomcatID."  

      # 擷取傳回狀态碼  

      TomcatServiceCode=$(curl -s -o $GetPageInfo -m 10 --connect-timeout 10 $WebUrl -w %{http_code})  

      if [ $TomcatServiceCode -eq 200 ];then  

          echo "[info]傳回碼為$TomcatServiceCode,tomcat啟動成功,頁面正常."  

      else  

          echo "[error]通路出錯,狀态碼為$TomcatServiceCode,錯誤日志已輸出到$GetPageInfo"  

          echo "[error]開始重新開機tomcat"  

          kill -9 $TomcatID  # 殺掉原tomcat程序  

          sleep 3  

          #rm -rf $TomcatCache # 清理tomcat緩存  

          $StartTomcat  

      fi  

      else  

      echo "[error]程序不存在!tomcat自動重新開機..."  

      echo "[info]$StartTomcat,請稍候......"  

      #rm -rf $TomcatCache  

      $StartTomcat  

    fi  

    echo "------------------------------"  

   }  

   Monitor>>$TomcatMonitorLog           

(27)通過位置變量建立 Linux 系統賬戶及密碼

#!/bin/bash




# 通過位置變量建立Linux 系統賬戶及密碼




# $1 是執行腳本的第一個參數,$2  是執行腳本的第二個參數




useradd "$1"

echo "$2" | passwd --stdin "$1"           

(28)對變量的傳入與擷取個數及列印

#!/bin/bash

echo "$0 $1 $2 $3"  // 傳入三個參數

echo $#    //擷取傳入參數的數量

echo $@    //列印擷取傳入參數

echo $*    //列印擷取傳入參數           

(29)實時監控本機記憶體和硬碟剩餘空間,剩餘記憶體小于500M、根分區剩餘空間小于1000M時,發送報警郵件給root管理者

#!/bin/bash




# 實時監控本機記憶體和硬碟剩餘空間,剩餘記憶體小于500M、根分區剩餘空間小于1000M時,發送報警郵件給root管理者




# 提取根分區剩餘空間

disk_size=$(df / | awk '/\//{print $4}')




# 提取記憶體剩餘空空間

mem_size=$(free | awk '/Mem/{print $4}')

while :

do 

# 注意記憶體和磁盤提取的空間大小都是以 Kb 為機關

if  [  $disk_size -le 512000 -a $mem_size -le 1024000  ]

then

    mail  ‐s  "Warning"  root  <<EOF

 Insufficient resources,資源不足

EOF

fi

done           

(30)檢查指定目錄下是否存在 對應 檔案

#!/bin/bash




if [ -f /home/wenmin/datas ]

then 

echo "File exists"

fi           

(31)腳本定義while循環語句

#!/bin/bash




if [ -f /home/wenmin/datas ]

then 

echo "File exists"

fi




[root@rich datas]# cat while.sh 

#!/bin/bash




s=0

i=1

while [ $i -le 100 ]

do

        s=$[$s + $i]

        i=$[$i + 1]

done




echo $s

echo $i           

(32)一鍵部署 LNMP(RPM 包版本)

#!/bin/bash 




# 一鍵部署 LNMP(RPM 包版本)

# 使用 yum 安裝部署 LNMP,需要提前配置好 yum 源,否則該腳本會失敗

# 本腳本使用于 centos7.2 或 RHEL7.2

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           

(33)讀取控制台傳入參數

#!/bin/bash

read -t 7 -p "input your name " NAME

echo $NAME




read -t 11 -p "input you age " AGE

echo $AGE




read -t 15 -p "input your friend " FRIEND

echo $FRIEND




read -t 16 -p "input your love " LOVE

echo $LOVE           

(34)腳本實作 複制

#!/bin/bash


cp $1 $2           

(35)腳本實作檔案存在與否的判斷

#!/bin/bash




if [ -f file.txt ];then

 echo "檔案存在"

else 

 echo "檔案不存在"

fi           

——END ——

資源領取 | 學習教育訓練 | 網工提升

請+V 咨詢

↓↓↓↓

微信号:glab-mary

文章來源:部分内容綜合自網絡,因覺優質,特此分享,侵删。