34個Linux Shell腳本,一定能幫到你!
(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
(10)腳本 殺掉 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
(11)打印國際象棋棋盤
#!/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
(12)統計當前 Linux 系統中可以登錄計算機的賬戶有多少個
#!/bin/bash
#?統計當前?Linux?系統中可以登錄計算機的賬戶有多少個
#方法?1:
grep?"bash$"?/etc/passwd?|?wc?-l
#方法 2:
awk?-f?:?'/bash$/{x++}end{print?x}'?/etc/passwd
(13)備份 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
(14)使用死循環實時顯示 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
(15)編寫腳本測試 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
(16)編寫腳本:提示用戶輸入用戶名和密碼, 腳本自動創建相應的賬戶及配置密碼。如果用戶
#!/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"
(17)使用腳本對輸入的三個整數進行排序
#!/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"
(18)根據計算機當前時間,返回問候語,可以將該腳本設置為開機啟動
#!/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"
(19)將 I lov cls 寫入到 txt 文件中
#!/bin/bash
cd?/home/wenmin/
touch?wenxing.txt
echo?"I?lov?cls"?>>wenxing.txt
(20)腳本編寫 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]
(21)腳本編寫 for 循環判斷
#!/bin/bash
for?i?in?"$*"
do?
?echo?"wenmin?xihuan?$i"
done
for?j?in?"$@"
do?
?echo?"wenmin?xihuan?$j"
done
(22)腳本 每周 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
(23)腳本編寫 求和 函數運算 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
(24)腳本編寫 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
(25)# 定義要監控的頁面地址,對 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
(26)通過位置變量創建 Linux 系統賬戶及密碼
#!/bin/bash
#?通過位置變量創建Linux?系統賬戶及密碼
#?$1?是執行腳本的第一個參數,$2??是執行腳本的第二個參數
useradd?"$1"
echo?"$2"?|?passwd?--stdin?"$1"
(27)對變量的傳入與獲取個數及打印
#!/bin/bash
echo?"$0?$1?$2?$3"??//?傳入三個參數
echo?$#????//獲取傳入參數的數量
echo?$@????//打印獲取傳入參數
echo?$*????//打印獲取傳入參數
(28)實時監控本機內存和硬盤剩余空間,剩余內存小于 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
(29)檢查指定目錄下是否存在 對應 文件
#!/bin/bash
if?[?-f?/home/wenmin/datas?]
then?
echo?"File?exists"
fi
(30)腳本定義 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
(31)一鍵部署 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
(32)讀取控制臺傳入參數
#!/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
(33)腳本實現 復制
#!/bin/bash
cp?$1?$2
(34)腳本實現文件存在與否的判斷
#!/bin/bash
if?[?-f?file.txt?];then
?echo?"文件存在"
else?
?echo?"文件不存在"
fi
轉自:入門小站