Shell 腳本編程是在 Linux 下學(xué)習(xí)或練習(xí)編程的最簡(jiǎn)單的方式。尤其對(duì)運(yùn)維工程師處理著自動(dòng)化任務(wù),且要開(kāi)發(fā)新的簡(jiǎn)單的實(shí)用程序或工具等(這里只是僅舉幾例)更是必備技能。
作為一名 Linux 工程師,會(huì)寫(xiě)好的腳本不僅能提高工作效率,還能有更多的時(shí)間做自己的事。最近在網(wǎng)上沖浪的時(shí)候,也注意收集一些大佬寫(xiě)過(guò)的腳本,匯總整理一下,歡迎收藏,與君共勉!
(1)用戶猜數(shù)字
#!/bin/bash
#腳本生成一個(gè)100以內(nèi)的隨機(jī)數(shù),提示用戶猜數(shù)字,根據(jù)用戶的輸入,提示用戶猜對(duì)了,
#猜小了或猜大了,直至用戶猜對(duì)腳本結(jié)束。
#RANDOM為系統(tǒng)自帶的系統(tǒng)變量,值為0‐32767的隨機(jī)數(shù)
#使用取余算法將隨機(jī)數(shù)變?yōu)?‐100的隨機(jī)數(shù)
num=$[RANDOM%100+1]
echo"$num"
#使用read提示用戶猜數(shù)字
#使用if判斷用戶猜數(shù)字的大小關(guān)系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于),
#‐lt(小于),‐le(小于等于)
while:
do
read-p"計(jì)算機(jī)生成了一個(gè)1‐100的隨機(jī)數(shù),你猜:"cai
if[$cai-eq$num]
then
echo"恭喜,猜對(duì)了"
exit
elif[$cai-gt$num]
then
echo"Oops,猜大了"
else
echo"Oops,猜小了"
fi
done
(2)查看有多少遠(yuǎn)程的 IP 在連接本機(jī)
#!/bin/bash
#!/bin/bash
#查看有多少遠(yuǎn)程的IP在連接本機(jī)(不管是通過(guò)ssh還是web還是ftp都統(tǒng)計(jì))
#使用netstat‐atn可以查看本機(jī)所有連接的狀態(tài),‐a查看所有,
#-t僅顯示tcp連接的信息,‐n數(shù)字格式顯示
#LocalAddress(第四列是本機(jī)的IP和端口信息)
#ForeignAddress(第五列是遠(yuǎn)程主機(jī)的IP和端口信息)
#使用awk命令僅顯示第5列數(shù)據(jù),再顯示第1列IP地址的信息
#sort可以按數(shù)字大小排序,最后使用uniq將多余重復(fù)的刪除,并統(tǒng)計(jì)重復(fù)的次數(shù)
netstat-atn|awk'{print$5}'|awk'{print$1}'|sort-nr|uniq-c
(3)helloworld
#!/bin/bash
functionexample{
echo"Helloworld!"
}
example
(4)打印 tomcat 的pid
#!/bin/sh`
v1="Hello"
v2="world"
v3=${v1}${v2}
echo$v3
pidlist=`ps-ef|grepapache-tomcat-7.0.75|grep-v"grep"|awk'{print$2}'`
echo$pidlist
echo"tomcatIdlist:$pidlist"//顯示pid
(5)腳本編寫(xiě) 剪刀 、 石頭、布游戲
#!/bin/bash
game=(石頭剪刀布)
num=$[RANDOM%3]
computer=${game[$sum]}
echo"請(qǐng)根據(jù)下列提示選擇您的出拳手勢(shì)"
echo"1.石頭"
echo"2.剪刀"
echo"3.布"
read-p"請(qǐng)選擇 1-3 :"person
case$personin
1)
if[$num-eq0]
then
echo"平局"
elif[$num-eq1]
then
echo"你贏"
else
echo"計(jì)算機(jī)贏"
fi;;
2)
if[$num-eq0]
then
echo"計(jì)算機(jī)贏"
elif[$num-eq1]
then
echo"平局"
else
echo"你贏"
fi;;
3)
if[$num-eq0]
then
echo"你贏"
elif[$num-eq1]
then
echo"計(jì)算機(jī)贏"
else
echo"平局"
fi;;
*)
echo"必須輸入1-3的數(shù)字"
esac
(6)九九乘法表
#!/bin/bash
foriin`seq9`
do
forjin`seq$i`
do
echo-n"$j*$i=$[i*j]"
done
echo
done
(7)腳本用源碼來(lái)安裝 memcached 服務(wù)器
#!/bin/bash
#一鍵部署memcached
#腳本用源碼來(lái)安裝memcached服務(wù)器
#注意:如果軟件的下載鏈接過(guò)期了,請(qǐng)更新memcached的下載鏈接
wgethttp://www.memcached.org/files/memcached-1.5.1.tar.gz
yum-yinstallgcc
tar-xfmemcached‐1.5.1.tar.gz
cdmemcached‐1.5.1
./configure
make
makeinstall
(8)檢測(cè)本機(jī)當(dāng)前用戶是否為超級(jí)管理員
#!/bin/bash
#檢測(cè)本機(jī)當(dāng)前用戶是否為超級(jí)管理員,如果是管理員,則使用yum安裝vsftpd,如果不
#是,則提示您非管理員(使用字串對(duì)比版本)
if[$USER=="root"]
then
yum-yinstallvsftpd
else
echo"您不是管理員,沒(méi)有權(quán)限安裝軟件"
fi
(9)if 運(yùn)算表達(dá)式
#!/bin/bash-xv
if[$1-eq2];then
echo"woaiwenmin"
elif[$1-eq3];then
echo"woaiwenxing"
elif[$1-eq4];then
echo"wodexin"
elif[$1-eq5];then
echo"wodeai"
fi
(10)腳本 殺掉 tomcat 進(jìn)程并重新啟動(dòng)
#!/bin/bash
#killtomcatpid
pidlist=`ps-ef|grepapache-tomcat-7.0.75|grep-v"grep"|awk'{print$2}'`#找到tomcat的PID號(hào)
echo"tomcatIdlist:$pidlist"//顯示pid
kill-9$pidlist#殺掉改進(jìn)程
echo"KILL$pidlist:"//提示進(jìn)程以及被殺掉
echo"servicestopsuccess"
echo"starttomcat"
cd/opt/apache-tomcat-7.0.75
pwd
rm-rfwork/*
cdbin
./startup.sh#;tail-f../logs/catalina.out
(11)打印國(guó)際象棋棋盤(pán)
#!/bin/bash
#打印國(guó)際象棋棋盤(pán)
#設(shè)置兩個(gè)變量,i和j,一個(gè)代表行,一個(gè)代表列,國(guó)際象棋為8*8棋盤(pán)
#i=1是代表準(zhǔn)備打印第一行棋盤(pán),第1行棋盤(pán)有灰色和藍(lán)色間隔輸出,總共為8列
#i=1,j=1代表第1行的第1列;i=2,j=3代表第2行的第3列
#棋盤(pán)的規(guī)律是i+j如果是偶數(shù),就打印藍(lán)色色塊,如果是奇數(shù)就打印灰色色塊
#使用echo‐ne打印色塊,并且打印完成色塊后不自動(dòng)換行,在同一行繼續(xù)輸出其他色塊
foriin{1..8}
do
forjin{1..8}
do
sum=$[i+j]
if[$[sum%2]-eq0];then
echo-ne"?33[46m?33[0m"
else
echo-ne"?33[47m?33[0m"
fi
done
echo
done
(12)統(tǒng)計(jì)當(dāng)前 Linux 系統(tǒng)中可以登錄計(jì)算機(jī)的賬戶有多少個(gè)
#!/bin/bash
#統(tǒng)計(jì)當(dāng)前Linux系統(tǒng)中可以登錄計(jì)算機(jī)的賬戶有多少個(gè)
#方法1:
grep"bash$"/etc/passwd|wc-l
#方法 2:
awk-f:'/bash$/{x++}end{printx}'/etc/passwd
(13)備份 MySQL 表數(shù)據(jù)
#!/bin/sh
source/etc/profile
dbName=mysql
tableName=db
echo[`date+'%Y-%m-%d%H:%M:%S'`]'startloadingdata...'
mysql-uroot-proot-P3306${dbName}-e"LOADDATALOCALINFILE'#/home/wenmin/wenxing.txt'INTOTABLE${tableName}FIELDSTERMINATEDBY';'"
echo[`date+'%Y-%m-%d%H:%M:%S'`]'endloadingdata...'
exit
EOF
(14)使用死循環(huán)實(shí)時(shí)顯示 eth0 網(wǎng)卡發(fā)送的數(shù)據(jù)包流量
#!/bin/bash
#使用死循環(huán)實(shí)時(shí)顯示eth0網(wǎng)卡發(fā)送的數(shù)據(jù)包流量
while:
do
echo'本地網(wǎng)卡 ens33 流量信息如下:'
ifconfigens33|grep"RXpack"|awk'{print$5}'
ifconfigens33|grep"TXpack"|awk'{print$5}'
sleep1
done
(15)編寫(xiě)腳本測(cè)試 192.168.4.0/24 整個(gè)網(wǎng)段中哪些主機(jī)處于開(kāi)機(jī)狀態(tài),哪些主機(jī)處于關(guān)機(jī)
#!/bin/bash
#編寫(xiě)腳本測(cè)試192.168.4.0/24整個(gè)網(wǎng)段中哪些主機(jī)處于開(kāi)機(jī)狀態(tài),哪些主機(jī)處于關(guān)機(jī)
#狀態(tài)(for版本)
foriin{1..254}
do
#每隔0.3秒ping一次,一共ping2次,并以1毫秒為單位設(shè)置ping的超時(shí)時(shí)間
ping-c2-i0.3-W1192.168.1.$i&>/dev/null
if[$?-eq0];then
echo"192.168.1.$iisup"
else
echo"192.168.1.$iisdown"
fi
done
(16)編寫(xiě)腳本:提示用戶輸入用戶名和密碼,腳本自動(dòng)創(chuàng)建相應(yīng)的賬戶及配置密碼。如果用戶
#!/bin/bash
#編寫(xiě)腳本:提示用戶輸入用戶名和密碼,腳本自動(dòng)創(chuàng)建相應(yīng)的賬戶及配置密碼。如果用戶
#不輸入賬戶名,則提示必須輸入賬戶名并退出腳本;如果用戶不輸入密碼,則統(tǒng)一使用默
#認(rèn)的 123456 作為默認(rèn)密碼。
read-p"請(qǐng)輸入用戶名:"user
#使用‐z可以判斷一個(gè)變量是否為空,如果為空,提示用戶必須輸入賬戶名,并退出腳本,退出碼為2
#沒(méi)有輸入用戶名腳本退出后,使用$?查看的返回碼為2
if[-z$user];then
echo"您不需要輸入賬戶名"
exit2
fi
#使用stty‐echo關(guān)閉shell的回顯功能
#使用sttyecho打開(kāi)shell的回顯功能
stty-echo
read-p"請(qǐng)輸入密碼:"pass
sttyecho
pass=${pass:-123456}
useradd"$user"
echo"$pass"|passwd--stdin"$user"
(17)使用腳本對(duì)輸入的三個(gè)整數(shù)進(jìn)行排序
#!/bin/bash
#依次提示用戶輸入3個(gè)整數(shù),腳本根據(jù)數(shù)字大小依次排序輸出3個(gè)數(shù)字
read-p"請(qǐng)輸入一個(gè)整數(shù):"num1
read-p"請(qǐng)輸入一個(gè)整數(shù):"num2
read-p"請(qǐng)輸入一個(gè)整數(shù):"num3
#不管誰(shuí)大誰(shuí)小,最后都打印echo"$num1,$num2,$num3"
#num1中永遠(yuǎn)存最小的值,num2中永遠(yuǎn)存中間值,num3永遠(yuǎn)存最大值
#如果輸入的不是這樣的順序,則改變數(shù)的存儲(chǔ)順序,如:可以將num1和num2的值對(duì)調(diào)
tmp=0
#如果num1大于num2,就把num1和和num2的值對(duì)調(diào),確保num1變量中存的是最小值
if[$num1-gt$num2];then
tmp=$num1
num1=$num2
num2=tmp
fi
#如果num1大于num3,就把num1和num3對(duì)調(diào),確保num1變量中存的是最小值
if[$num1-gt$num3];then
tmp=$num1
num1=$num3
num3=$tmp
fi
#如果num2大于num3,就把num2和num3對(duì)調(diào),確保num2變量中存的是最小值
if[$num2-gt$num3];then
tmp=$num2
num2=$num3
num3=$tmp
fi
echo"排序后數(shù)據(jù)(從小到大)為:$num1,$num2,$num3"
(18)根據(jù)計(jì)算機(jī)當(dāng)前時(shí)間,返回問(wèn)候語(yǔ),可以將該腳本設(shè)置為開(kāi)機(jī)啟動(dòng)
#!/bin/bash
#根據(jù)計(jì)算機(jī)當(dāng)前時(shí)間,返回問(wèn)候語(yǔ),可以將該腳本設(shè)置為開(kāi)機(jī)啟動(dòng)
#00‐12點(diǎn)為早晨,12‐18點(diǎn)為下午,18‐24點(diǎn)為晚上
#使用date命令獲取時(shí)間后,if判斷時(shí)間的區(qū)間,確定問(wèn)候語(yǔ)內(nèi)容
tm=$(date+%H)
if[$tm-le12];then
msg="GoodMorning$USER"
elif[$tm-gt12-a$tm-le18];then
msg="GoodAfternoon$USER"
else
msg="GoodNight$USER"
fi
echo"當(dāng)前時(shí)間是:$(date+"%Y‐%m‐%d%H:%M:%S")"
echo-e"?33[34m$msg?33[0m"
(19)將 I lov cls 寫(xiě)入到 txt 文件中
#!/bin/bash
cd/home/wenmin/
touchwenxing.txt
echo"Ilovcls">>wenxing.txt
(20)腳本編寫(xiě) for 循環(huán)判斷
#!/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]
(21)腳本編寫(xiě) for 循環(huán)判斷
#!/bin/bash
foriin"$*"
do
echo"wenminxihuan$i"
done
forjin"$@"
do
echo"wenminxihuan$j"
done
(22)腳本 每周 5 使用 tar 命令備份/var/log 下的所有日志文件
#!/bin/bash
#每周5使用tar命令備份/var/log下的所有日志文件
#vim/root/logbak.sh
#編寫(xiě)備份腳本,備份后的文件名包含日期標(biāo)簽,防止后面的備份將前面的備份數(shù)據(jù)覆蓋
#注意date命令需要使用反引號(hào)括起來(lái),反引號(hào)在鍵盤(pán)鍵上面
tar-czflog-`date+%Y%m%d`.tar.gz/var/log
#crontab-e#編寫(xiě)計(jì)劃任務(wù),執(zhí)行備份腳本
0003**5/home/wenmin/datas/logbak.sh
(23)腳本編寫(xiě) 求和 函數(shù)運(yùn)算 function xx()
#!/bin/bash
functionsum()
{
s=0;
s=$[$1+$2]
echo$s
}
read-p"inputyourparameter"p1
read-p"inputyourparameter"p2
sum$p1$p2
functionmulti()
{
r=0;
r=$[$1/$2]
echo$r
}
read-p"inputyourparameter"x1
read-p"inputyourparameter"x2
multi$x1$x2
v1=1
v2=2
letv3=$v1+$v2
echo$v3
(24)腳本編寫(xiě) case — esac 分支結(jié)構(gòu)表達(dá)式
#!/bin/bash
case$1in
1)
echo"wenmin"
;;
2)
echo"wenxing"
;;
3)
echo"wemchang"
;;
4)
echo"yijun"
;;
5)
echo"sinian"
;;
6)
echo"sikeng"
;;
7)
echo"yanna"
;;
*)
echo"danlian"
;;
esac
(25)# 定義要監(jiān)控的頁(yè)面地址,對(duì) tomcat 狀態(tài)進(jìn)行重啟或維護(hù)
#!/bin/sh
#function:自動(dòng)監(jiān)控tomcat進(jìn)程,掛了就執(zhí)行重啟操作
#author:huanghong
#DEFINE
#獲取tomcatPPID
TomcatID=$(ps-ef|greptomcat|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
#定義要監(jiān)控的頁(yè)面地址
WebUrl=http://192.168.254.118:8080/
#日志輸出
GetPageInfo=/dev/null
TomcatMonitorLog=/tmp/TomcatMonitor.log
Monitor()
{
echo"[info]開(kāi)始監(jiān)控tomcat...[$(date+'%F%H:%M:%S')]"
if[$TomcatID]
then
echo"[info]tomcat進(jìn)程ID為:$TomcatID."
#獲取返回狀態(tài)碼
TomcatServiceCode=$(curl-s-o$GetPageInfo-m10--connect-timeout10$WebUrl-w%{http_code})
if[$TomcatServiceCode-eq200];then
echo"[info]返回碼為$TomcatServiceCode,tomcat啟動(dòng)成功,頁(yè)面正常."
else
echo"[error]訪問(wèn)出錯(cuò),狀態(tài)碼為$TomcatServiceCode,錯(cuò)誤日志已輸出到$GetPageInfo"
echo"[error]開(kāi)始重啟tomcat"
kill-9$TomcatID#殺掉原tomcat進(jìn)程
sleep3
#rm-rf$TomcatCache#清理tomcat緩存
$StartTomcat
fi
else
echo"[error]進(jìn)程不存在!tomcat自動(dòng)重啟..."
echo"[info]$StartTomcat,請(qǐng)稍候......"
#rm-rf$TomcatCache
$StartTomcat
fi
echo"------------------------------"
}
Monitor>>$TomcatMonitorLog
(26)通過(guò)位置變量創(chuàng)建 Linux 系統(tǒng)賬戶及密碼
#!/bin/bash
#通過(guò)位置變量創(chuàng)建Linux系統(tǒng)賬戶及密碼
#$1是執(zhí)行腳本的第一個(gè)參數(shù),$2是執(zhí)行腳本的第二個(gè)參數(shù)
useradd"$1"
echo"$2"|passwd--stdin"$1"
(27)對(duì)變量的傳入與獲取個(gè)數(shù)及打印
#!/bin/bash
echo"$0$1$2$3"//傳入三個(gè)參數(shù)
echo$#//獲取傳入?yún)?shù)的數(shù)量
echo$@//打印獲取傳入?yún)?shù)
echo$*//打印獲取傳入?yún)?shù)
(28)實(shí)時(shí)監(jiān)控本機(jī)內(nèi)存和硬盤(pán)剩余空間,剩余內(nèi)存小于500M、根分區(qū)剩余空間小于1000M時(shí),發(fā)送報(bào)警郵件給root管理員
#!/bin/bash
#實(shí)時(shí)監(jiān)控本機(jī)內(nèi)存和硬盤(pán)剩余空間,剩余內(nèi)存小于500M、根分區(qū)剩余空間小于1000M時(shí),發(fā)送報(bào)警郵件給root管理員
#提取根分區(qū)剩余空間
disk_size=$(df/|awk'///{print$4}')
#提取內(nèi)存剩余空空間
mem_size=$(free|awk'/Mem/{print$4}')
while:
do
#注意內(nèi)存和磁盤(pán)提取的空間大小都是以Kb為單位
if[$disk_size-le512000-a$mem_size-le1024000]
then
mail‐s"Warning"root<fi
done
(29)檢查指定目錄下是否存在 對(duì)應(yīng) 文件
#!/bin/bash
if[-f/home/wenmin/datas]
then
echo"Fileexists"
fi
(30)腳本定義while循環(huán)語(yǔ)句
#!/bin/bash
if[-f/home/wenmin/datas]
then
echo"Fileexists"
fi
[root@richdatas]#catwhile.sh
#!/bin/bash
s=0
i=1
while[$i-le100]
do
s=$[$s+$i]
i=$[$i+1]
done
echo$s
echo$i
(31)一鍵部署 LNMP(RPM 包版本)
#!/bin/bash
#一鍵部署LNMP(RPM包版本)
#使用yum安裝部署LNMP,需要提前配置好yum源,否則該腳本會(huì)失敗
#本腳本使用于centos7.2或RHEL7.2
yum-yinstallhttpd
yum-yinstallmariadbmariadb-develmariadb-server
yum-yinstallphpphp-mysql
systemctlstarthttpdmariadb
systemctlenablehttpdmariadb
(32)讀取控制臺(tái)傳入?yún)?shù)
#!/bin/bash
read-t7-p"inputyourname"NAME
echo$NAME
read-t11-p"inputyouage"AGE
echo$AGE
read-t15-p"inputyourfriend"FRIEND
echo$FRIEND
read-t16-p"inputyourlove"LOVE
echo$LOVE
(33)腳本實(shí)現(xiàn) 復(fù)制
#!/bin/bash
cp$1$2
(34)腳本實(shí)現(xiàn)文件存在與否的判斷
#!/bin/bash
if[-ffile.txt];then
echo"文件存在"
else
echo"文件不存在"
fi
-
Linux
+關(guān)注
關(guān)注
87文章
11232瀏覽量
208952 -
編程
+關(guān)注
關(guān)注
88文章
3596瀏覽量
93610
原文標(biāo)題:運(yùn)維常用的 34 個(gè) Linux Shell 腳本,一定能幫到你!
文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論