分享一些实用linux shell脚本例子
1、本脚本主要目的是获取主机的数据信息。例如:内存、网卡IP、CPU负载。sys_info.sh#!/bin/bashlocalip=$(ifconfig ens33 | grep netmask | tr -s " " | cut -d " " -f3)mem=$(free | grep Mem | tr -s " " | cut -d " " -f7)cpu=$(uptime | tr -s
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),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下:
更多推荐
所有评论(0)