天天看點

常用Shell腳本整理

分享一些shell,持續更新ing~

(有工作中用到的,有面試問到的,小夥伴們可以收藏一下。)

一.(列印99乘法表。)

#!/bin/bash
for i in `seq 9`
do
    for j in `seq 9`
        do
        [ $j -le $i ] && echo -n "$i x $j = `echo $(($i*$j))`  "  
    done
echo ""
done

           

二.(1到某個數字相加的值。)

#!/bin/bash
 
read -p "請輸入一個數字" nub

sum=0; 
for ((i=0;i<=$nub;i++))
do 
  sum=`expr $sum + $i`
done 
echo $sum

           

三.一對兔子一年内(12個月)能繁殖成多少對?

#!/bin/bash
#有個人想知道,一年之内一對兔子能繁殖多少對?于是就築了一道圍牆把一對兔子關在裡面。
#已知一對兔子每個月可以生一對小兔子,而一對兔子從出生後第3個月起每月生一對小兔子。
#假如一年内沒有發生死亡現象,那麼,一對兔子一年内(12個月)能繁殖成多少對?
#兔子的規律為數列,1,1,2,3,5,8,13,21)

f1=1  #第一個月
f2=1  #第二個月
sum=0 #一年洪一共有多少
for ((i=3;i<=12;i++)) #第一次生小兔子是在3月份
do 
sum=$[ $f1+$f2 ]
f1=$f2
f2=$sum
done 
echo "一對兔子一年内可以繁殖$sum隻兔子"

           

四.猜數字小遊戲

#!/bin/sh
 echo " 猜數字遊戲開始啦~"
 read -p "請輸入您的姓名: " name 
 biggest=1000              # 可能出現的最大數字
 guess=0                # 你的猜測值
 guesses=0               # 猜測的次數
 number=$(($$ % $biggest))       # 随機數字。介于1和$biggest之間
 
 while [ $guess -ne $number ] 
 do
  echo -n "你猜? " ; read guess
  if [ "$guess" -lt $number ] ; then
   echo "... 太小了!"
  elif [ "$guess" -gt $number ] ; then
   echo "... 太大了"
  fi
  guesses=$(($guesses + 1))
 done
 echo "恭喜您:$name,猜中了。 數字為$number 猜測了 $guesses 次 遊戲結束."
 exit 0

           

五.批量建立使用者

#!/bin/sh
read -ep "請輸入要建立的使用者數量:" sl                                   #擷取使用者鍵盤輸入的值  為$sl
for i in `seq 1 $sl`                                                    #定義i變量進行周遊 從1開始導$sl值 直到i=sl 結束 
do
        grep "user-$i" /etc/passwd &> /dev/null                         #檢視在/etc/passwd中有沒有該使用者 
        if [ $? -ne 0 ];then                                    #-ne  不等于    $? 擷取上一條指令的傳回值  如果=0 跳到else輸出 如果=0 進入if循環 
        useradd user-$i &>/dev/null                                     #建立使用者
                if [ $? -eq 0 ];then                                    #-eq   等于    
                echo "user-$i" >> /root/user_name                       #吧建立成功的使用者名追加輸出到/root/user_name
                echo "user-$i" | passwd user-$i --stdin &> /dev/null    #設定目前建立的使用者密碼為使用者名
                echo "建立成功"
                fi
        else
        echo "user-$i 使用者已存在,建立失敗!"
        fi      
done            

           

六.監控mysql主從同步是否正常。

#!/bin/bash
#擷取本地服務端口,是否為3306根據情況修改。
MYSQLPORT=`netstat -na|grep "LISTEN"|grep "3306"|awk -F[:" "]+ '{ print $5 }'`
#擷取本機IP,發郵件報警時調用,可以不寫。
MYSQLIP=`ifconfig ens33|grep "inet "|awk -F[:" "]+ '{ print $3 }'`
#顯示目前時間,年月時分秒
date=`date "+%Y-%m-%d %H:%M:%S"`
#擷取IO及SQL線程行
STATUS=$(mysql -uroot -S /var/lib/mysql/mysql.sock -e "show slave status \G" |grep -i "running")
#提取I/O及SQL線程的狀态,Yes或No
IO_env=`echo $STATUS |grep IO |awk '{ print $2 }'`
SQL_env=`echo $STATUS |grep SQL |awk '{ print $2 }'`
#判斷變量值是否=本地端口号 
#日志發送格式  mail -s "标題" 郵箱  << "内容"  
#或者  echo "内容"| mail -s mail -s "标題" 郵箱 
if [ "$MYSQLPORT" = "3306" ]; then 
   echo " mysql is running" >/dev/null
 else
   echo "mysql is shutdown"
   echo "$MYSQLIP is shutdown $date" |  mail -s " MYSQL IS shutdown" [email protected]
fi 
#-a 如果存在即為真 左右兩個判斷都要同時存在
if [ "IO_env"="Yes" -a "$SQL_env"="Yes" ]; then 
    echo "slave is running!" >/dev/null 
 else
    echo "slave is not running! $date" >> /usr/src/mariadb_error.log  #這裡寫不寫都無所謂 
    echo "slave not running $date" | mail -s "MYSQLIP is not running" [email protected] 
fi

           

七.監控系統cpu,大于80%說明可能存在CPU不足

#!/bin/bash
mail='mail -s "cup報警" [email protected]'
DATE=`date "+%Y-%m-%d %H:%M:%S"`
MYIP=`ifconfig ens33 |grep "inet " |awk -F[:" "]+ '{ print $3 }'`
MASG="您的機器$MYIP于$DATE已經CUP使用過高,已經使用了:"
cpu_us=$(vmstat |awk '{print $13}' |sed -n '$p')
cpu_sy=$(vmstat |awk '{print $14}' |sed -n '$p')
cpu_id=$(vmstat |awk '{print $15}' |sed -n '$p')
cpu_sum=$(($cup_us + $cpu_sy))
if (( $cpu_sum >= 80 )) 
  then
 echo "$MASG$cpu_sum%"| $mail  
  else 
 echo "$DATE:CPU資源已經消耗了$cpu_sum%" 
fi

           

八:shell備份mysql資料庫

#!/bin/bash
#backup_mysql
#2021-03-26
Mail= mail -s "MysqlDump fail " [email protected]
#備份目錄 
BackupDir=/home/backup
#共享目錄,異機備份
SaveDir=/data/sdv1/backup
#目前日期時間
fdate=`date "+%Y-%m-%d"`
#設定目錄屬主和屬組 賦權
chown -R mysql:mysql $BackupDir
chmod -R 775 $BackupDir
chmod -R 775 $SaveDir
#備份庫 
function test () {
      echo "$fdate Begin backup test database" >> $BackupDir/backmysql.log
#判斷目錄是否存在   -d:存在即為真  !表否定  
  if [ ! -d $BackupDir/mysql ];then 
	  mkdir -p $BackupDir/mysql
	  chown -R mysql:mysql $BackupDir/mysql
  fi 
#備份test庫
mysqldump -uroot -p'rootroot' test > $BackupDir/mysql/test_"$fdate".sql
#$?  擷取上條指令的執行傳回值,正常為0。 
  if [ $? -eq 0 ];then
      echo "$fdate backup test database success" >> $BackupDir/backmysql.log
    else 
      echo "$fdate backup test database fail"   >> $BackupDir/backmysql.log
	  echo "$fdate backup test database fail"  | $Mail
  fi 
}
#壓縮備份及删除
function compress () {
      echo "$fdate Begin complete database " >> $BackupDir/backmysql.log
#壓縮打包備份檔案的目錄
      cd $BackupDir
	  tar -cf mysql_$fdate.tar mysql
#如果上條指令執行成功,則删除3天前的備份檔案 	  
  if [ $? -eq 0 ];then 
      echo "$fdate complete done" >> $BackupDir/backmysql.log
	  find $BackupDir -mtime +3 -exec rm -rf{} \; 
  fi
#吧本地備份拷貝到異機備份,
      cd $BackupDir
      cp mysql_$fdate.tar $SaveDir
      echo "$fdate cp date to savedir done " >> $BackupDir/backmysql.log
	  nuf=`find $SaveDir -name '*.tar' -size +10M|wc -l`
  if [[ $? -eq 0 && $nuf -gt 3 ]];then
      echo "$fdate delete nfs than 7 days" >> $BackupDir/backmysql.log
  fi 
      echo "$fdate all is ok" >> $BackupDir/backmysql.log
	  cp -r $BackupDir/backmysql.log $SaveDir
}
test
compress


           

繼續閱讀