分享一些實用linux shell腳本例子

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),回覆:領取學習資料。或者回復:進入技術交流羣。網盤資料有如下:

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章