分享一些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