1、本腳本主要目的是獲取主機的數據信息。例如:內存、網卡IP、CPU負載。
sys_info.sh
#!/bin/bash
localip=$(ifconfig ens33 | grep netmask | tr -s " " | cut -d " " -f3)
mem=$(free | grep Mem | tr -s " " | cut -d " " -f7)
cpu=$(uptime | tr -s " " | cut -d " " -f11)
echo "IP address:$localip"
echo "Memory surplus:$mem"
echo "CPU load:$cpu"
這個腳本中定義了三個變量,三個變量值都是命令的返回值,因此每次執行腳本時變量都有可能發生變化。但是,不管變量的值怎麼變化,腳本都是可以在最後正常的輸出這些變量的值。
還有就是,第一個變量localip存儲本機ens33(或者你的網卡是eth0)網卡IP地址。第二個變量mem存儲本機內存剩餘的容量。第三個變量,cpu存儲本機CPU平均負載。
2、測試計算機的CPU品牌是AMD還是Intel
cpu_info.sh
#!/bin/bash
if grep -q AMD /proc/cpuinfo; then
echo "AMD CPU"
fi
if grep -q Intel /proc/cpuinfo; then
echo "Intel CPU"
fi
測試的結果是Intel的,grep -q選項,可以讓grep進入靜默模式,不管是否獲取數據,都不顯示輸出結果。if命令通過grep命令的返回值自動判斷是否獲取數據。
3、服務狀態監控
check_service.sh
#!/bin/bash
if [ -z $1 ];then
echo "error:No server name was entered"
echo "Usage: script name + server name"
exit
fi
if systemctl is-active $1 &>/dev/null; then
echo "$1 have already started"
else
echo "$1 unstart"
fi
if systemctl is-enabled $1 &>/dev/null; then
echo "$1 Is the boot auto option"
else
echo "$1 Not start auto option"
fi
上面的例子,可以通過if條件語句自動判斷服務的各種狀態,是否已經啓動、是否爲開機自啓動項等。
4、通過讀取位置變量,實現分區管理工作
#!/bin/bash
if [ $# -ne 2 ];then
echo -e "usage: <disk name> <create|new|remove|query>"
exit
fi
#測試磁盤是否存在
if [ ! -b $1 ];then
echo -e "disk nonentity"
exit
fi
#根據不同的指令對磁盤進行分區管理
if [[ $2 == create ]];then
parted -s $1 mklabel gpt
elif [[ $2 == new ]];then
parted -s $1 mkpart primary 1 100%
elif [[ $2 == remove ]];then
parted -s $1 rm 1
elif [[ $2 == query ]];then
parted -s $1 print
else
clear
echo -e "operation error"
echo "use:[create|new|remove|query]."
fi
上面是利用parted命令還可以進行分區檢查、調整分區大小、恢復誤刪除分區操作,關於parted命令的更多使用方法,可以查看man手冊。
5、查看系統信息的腳本
#!/bin/bash
echo "輸入一個選項"
select item in "CPU" "IP" "MEM" "exit"
do
case $item in
"CPU")
uptime;;
"IP")
ip a s;;
"MEM")
free;;
"exit")
exit;;
*)
echo error;;
esac
done
上面的功能是根據用戶選擇的菜單實現對於的功能。
6、通過文件重定向讀取文件解決子shell問題
#!/bin/bash
tmp_file="/tmp/subshell-$$.txt"
df | grep "^/" > $tmp_file
while read name total used free other
do
let sum+=free
done < $tmp_file
rm -rf $tmp_file
echo $sum
在腳本中使用外部命令,包括加載其他腳本也都會開啓一個子shell,所以在腳本需要調用其他腳本時一定要使用source加載。例如:
source ./test.sh
7、多進程的ping腳本
本腳本的功能就是使用函數與&後臺進程實現多進程ping測試。
#!/bin/bash
net="192.168.43"
multi_ping_fun(){
ping -c2 -i0.2 -W1 $1 &>/dev/null
if [ $? -eq 0 ];then
echo "$1 is up"
else
echo "$1 is down"
fi
}
for i in {1..254}
do
multi_ping_fun $net.$i &
done
腳本執行結果,因爲在循環體中是以後臺方式執行的multi_ping_fun函數的,所以不再需要等待第一臺主機測試完以後再測試下一臺主機,瞬間就可以將254臺主機的測試任務都放入後臺執行。
我們可以繼續優化上面的腳本,在腳本最後添加一個wait命令,這樣可以在所有的後臺子進程都結束,也就是所有的ping測試都結束後,再退出腳本。
#!/bin/bash
net="192.168.43"
multi_ping_fun(){
ping -c2 -i0.2 -W1 $1 &>/dev/null
if [ $? -eq 0 ];then
echo "$1 is up"
else
echo "$1 is down"
fi
}
#通過循環反覆調用函數並將其放入後臺並行執行
for i in {1..254}
do
multi_ping_fun $net.$i &
done
wait
8、循環對多個文件進行備份操作
使用ls 或者find命令列出文件時默認都是帶路徑的,而有些時候我們僅需要文件名即可,這個時候使用basename提取文件名。
#!/bin/bash
for i in `ls /etc/*.conf`
do
tar -czf /home/minger/share/tencent/shell/$(basename $i).tar.gz $i
done
9、使用進程號或進程數量生成隨機數
有時候我們編寫的腳本需要生成一些臨時文件,而臨時文件的文件名就可以使用一些隨機數據以防止與其他文件名稱衝突,這時就可以考慮使用進程號、進程個數、文件行或者文件個數之類的方式生成隨機數。其中進程個數和文件個數發生僞隨機衝突的可能性比較大,不太適合重複執行的腳本。對於需要重複執行的腳本,採用進程號更合適。
readfile.sh
#!/bin/bash
#根據進程號生成隨機文件
touch /tmp/$$.tmp
#根據進程數量生成隨機文件
pnum=`ps aux | wc -l`
touch /tmp/$pnum.tmp
#根據文件個數生成隨機文件
fnum=`find /etc | wc -l`
touch /tmp/$fnum.tmp
#根據文件行數生成隨機文件
cnum=`cat /var/log/messages | wc -l`
touch /tmp/$cnum.tmp
10、Shell 版本的進度條功能
如果我們在編寫一個需要執行很長時間的腳本,如複製文件、源碼編譯安裝軟件包等,爲這樣的腳本設計一個進度條就是一個不錯的方法,可以很好地提升腳本的使用體驗。進度條也分很多種,可以是色塊的進度條,可以是數字百分比進度條,也可以是某種動態效果的進度條。
#!/bin/bash
#防止提前按Ctrl +C 組合鍵後無法結束進度條
trap 'kill $!' INT
bar(){
while :
do
echo -n '#'
sleep 0.3
done
}
bar &
cp -r $1 $2
kill $!
echo "複製結束!"
首先,我們做一個最簡單的不控制數量的進度條,我們只需在屏幕上不停的顯示某種進度符號或色塊即可,直到腳本任務執行完成,再將進度條殺死kill
歡迎關注公衆號【程序猿編碼】,添加本人微信號(17865354792),回覆:領取學習資料。或者回復:進入技術交流羣。網盤資料有如下: