news 2026/5/1 9:32:22

25 个实用 Shell 脚本:赋能 Linux 运维效率提升

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
25 个实用 Shell 脚本:赋能 Linux 运维效率提升
1、检测服务器是否正常

假设,当前MySQL服务的root密码为123456,写脚本检测MySQL服务是否正常(比如,可以正常进入mysql执行show processlist),

并检测一下当前的MySQL服务是主还是从,如果是从,请判断它的主从服务是否异常。如果是主,则不需要做什么。

#!/bin/bash mysql="/usr/local/mysql/bin/mysql -uroot -p123456" if ! $mysql -e "show processlist" >/dev/null 2>/dev/null then echo "MySQL service is down." exit else $mysql -e "show slave status\G" 2>/dev/null >/tmp/slave.stat n=`wc -l /tmp/slave.stat|awk '{print $1}'` if [ $n -eq 0 ] then echo "This is master." else echo "This is slave." egrep 'Slave_IO_Running:|Slave_SQL_Running:'/tmp/slave.stat|awk -F ': ' '{print $2}' > /tmp/SQL.tmp if grep -qw "No" /tmp/SQL.tmp then echo "The slave is down." fi fi fi
2、写一个支持选项的增加或删除用户的shell脚本,具体要求如下:

1. 只支持三个选项:'--del','--add','--help',输入其他选项报错。
2. 使用'--add'时,需要验证用户名是否存在,存在则反馈存在,且不添加。 不存在则创建该用户,需要设置与该用户名相同的密码。
3. 使用'--del'时,需要验证用户名是否存在,存在则删除用户及其家目录。不存在则反馈该用户不存在。
4. --help选项反馈出使用方法。
5. 能用echo $?检测脚本执行情况,成功删除或添加用户为0,不成功为非0正整数。
6. 能以英文逗号分割,一次性添加或者删除多个用户。例如 adddel.sh --add user1,user2,user3

#!/bin/baash if [ $# -eq 0 ] || [ $# -gt 2 ] then echo "Wrong, use bash $0 --add username, or bash $0 --del username or bash $0 --help" exit fi ex_user() { if ! id $1 2>/dev/null >/dev/null then useradd $1 && echo "$1 add successful." else echo $1 exist. fi } notex_user() { if id $1 2>/dev/null >/dev/null then userdel $1 && echo "$1 delete successful." else echo $1 not exist. fi } case $1 in --add) if [ $# -eq 1 ] then echo "Wrong, use bash $0 --add user or bash $0 --add user1,user2,user3..." exit else n=`echo $2| awk -F ',' '{print NF}'` if [ $n -gt 1 ] then for i in `seq 1 $n` do username=`echo $2 |awk -v j=$i -F ',' '{print $j}'` ex_user $username done else ex_user $2 fi fi ;; --del) if [ $# -eq 1 ] then echo "Wrong, use bash $0 --del user or bash $0 --del user1,user2,user3..." exit else n=`echo $2| awk -F ',' '{print NF}'` if [ $n -gt 1 ] then for i in `seq 1 $n` do username=`echo $2 |awk -v j=$i -F ',' '{print $j}'` notex_user $username done else notex_user $2 fi fi ;; --help) if [ $# -ne 1 ] then echo "Wrong, use bash $0 --help" exit else echo "Use bash $0 --add username or bash $0 --add user1,user2,user3... add user." echo " bash $0 --del username -r bash $0 --del user1,user2,user3... delete user." echo " bash $0 --help print this info." fi ;; *) echo "Wrong, use bash $0 --add username, or bash $0 --del username or bash $0 --help" ;; esac
3、写一个脚本: 计算100以内所有能被3整除的正整数的和
#!/bin/bash sum=0 for i in `seq 1 100` do j=$[$i%3] if [ $j -eq 0 ] then sum=$[$sum+$i] fi done echo $sum
4、使用传参的方法写个脚本,实现加减乘除的功能。
例如: sh a.sh 1 2,这样会分别计算加、减、乘、除的结果。

要求:
1. 脚本需判断提供的两个数字必须为整数
2. 当做减法或者除法时,需要判断哪个数字大,减法时需要用大的数字减小的数字,除法时需要用大的数字除以小的数字,并且结果需要保留两个小数点

#!/bin/bash is_nu() { n=`echo $1 |sed 's/[0-9]//g'` if [ -n "$n" ] then echo "给出的参数必须是正整数" exit fi } if [ $# -ne 2 ] then echo "必须要输入两个参数" exit else is_nu $1 is_nu $2 fi big() { if [ $1 -gt $2 ] then echo $1 else echo $2 fi } small() { if [ $1 -lt $2 ] then echo $1 else echo $2 fi } add() { sum=$[$1+$2] echo "$1+$2=$sum" } jian() { b=`big $1 $2` s=`small $1 $2` cha=$[$b-$s] echo "$b-$s=$cha" } cheng() { ji=$[$1*$2] echo "$1x$2=$ji" } chu() { b=`big $1 $2` s=`small $1 $2` v=`echo "scale=2;$b/$s"|bc` echo "$b/$s=$v" } add $1 $2 jian $1 $2 cheng $1 $2 chu $1 $2
5、写一个脚本,执行后,打印一行提示“Please input a number:",要求用户输入数值,然后打印出该数值,然后再次要求用户输入数值。直到用户输入"end"停止。
#!/bin/bash while : do read -p "Please input a number: " n if [ -z "$n" ] then echo "请输入一个纯数字." continue fi if echo $n |grep -qi 'end' then exit fi n1=`echo $n|sed 's/[0-9]//g'` if [ -n "$n1" ] then echo "请输入一个纯数字." continue else echo "你输入的数字是: $n" continue fi done
6、提示用户输入网卡的名字,然后我们用脚本输出网卡的ip,需要考虑下面问题:

1. 输入的字符不符合网卡名字规范,怎么应对。
2. 名字符合规范,但是根本就没有这个网卡又怎么应对。

#!/bin/bash ip add |awk -F ': ' '$1 ~ "^[1-9]" {print $2}' > /tmp/eth.list while : do eths=`cat /tmp/eth.list |xargs` read -p "Please input a if name(The eths is `echo -e "\033[31m$eths\033[0m"`): " eth if [ -z "$eth" ] then echo "Please input a if name." continue fi if ! grep -qw "$eth" /tmp/eth.list then echo "The if name is error." continue else break fi done if_ip() { ip add show dev $1 |grep ' inet ' |awk '{print $2}'|awk -F '/' '{print $1}' >/tmp/$1.txt n=`wc -l /tmp/$1.txt|awk '{print $1}'` if [ $n -eq 0 ] then echo "There is no ip address on the eth." else echo "The ip addreess is:" for ip in `cat /tmp/$1.txt` do echo -e "\033[33m$ip\033[0m" done fi } if_ip $eth
7、写一个脚本,实现如下功能:

1. 脚本可以带参数也可以不带
2. 参数可以有多个,每个参数必须是一个目录
3. 脚本检查参数个数,若等于0,则列出当前目录本身,否则显示每个参数包含的子目录。
#!/bin/bash if [ $# -eq 0 ] then echo "当前目录下的文件是:" ls . else for d in $@ do if [ -d $d ] then echo "目录$d下有这些子目录:" find $d -type d else echo "并没有该目录:$d" fi done fi
8、定义一个shell函数,能接受两个参数,满足以下要求:

1. 第一个参数为URL,即可下载的文件,第二个参数为目录,即下载后保存的位置
2. 如果用户给的目录不存在,则提示用户是否创建,如果创建就继续执行,否则,函数返回一个51的错误值给调用脚本
3. 如果给的目录存在,则下载文件,下载命令执行结束后测试文件下载成功与否,如果成功,则返回0给调用脚本,否则,返回52给调用脚本
#!/bin/bash if [ $# -ne 2 ] then echo "你必须要输入两个参数,第一个参数是网址,第二个参数是目录." exit 1 fi if [ ! -d $2 ] then while : do echo "你输入的第二个参数,并不是一个存在的目录。是否要创建该目录呢?(y|n): "c case $c in y|Y) mkdir -p $2 ;; n|N) exit 51 ;; *) echo "请输入y或者n." continue ;; esac done else cd $2 wget $1 if [ $? -eq 0 ] then exit 0 else echo "下载失败." exit 52 fi fi
9、写一个猜数字脚本,当用户输入的数字和预设数字(随机生成一个0-100的数字)一样时,直接退出,否则让用户一直输入,并且提示用户的数字比预设数字大或者小。
#!/bin/bash n=$[$RANDOM%101] while : do read -p "请输入一个0-100的数字:" n1 if [ -z "$n1" ] then echo "必须要输入一个数字。" continue fi n2=`echo $n1 |sed 's/[0-9]//g'` if [ -n "$n2" ] then echo "你输入的数字并不是正整数." continue else if [ $n -gt $n1 ] then echo "你输入的数字小了,请重试。" continue elif [ $n -lt $n1 ] then echo "你输入的数字大了,请重试。" continue else echo "恭喜你,猜对了!" break fi fi done
10、写一个shell脚本,能实现如下需求:

1. 执行脚本后,提示输入名字(英文的,可以是大小写字母、数字不能有其他特殊符号),然后输出一个随机的0-99之间的数字,脚本并不会退出,继续提示让输入名字
2. 如果输入相同的名字,输出的数字还是第一次输入该名字时输出的结果
3. 前面已经输出过的数字,下次不能再出现
4. 当输入q或者Q时,脚本会退出。
#!/bin/bash f=/tmp/user_number.txt j_n() { while : do n=$[RANDOM%100] if awk '{print $2}' $f|grep -qw $n then continue else break fi done } while : do read -p "Please input a username: " u if [ -z "$u" ] then echo "请输入用户名." continue fi if [ $u == "q" ] || [ $u == "Q" ] then exit fi u1=`echo $u|sed 's/[a-zA-Z0-9]//g'` if [ -n "$u1" ] then echo "你输入的用户名不符合规范,正确的用户名应该是大小写字母和数字的组合" continue else if [ -f $f ] then u_n=`awk -v uu=$u '$1==uu {print $2}' $f` if [ -n "$u_n" ] then echo "用户$u对应的数字是:$u_n" else j_n echo "用户$u对应的数字是:$n" echo "$u $n" >>$f fi else j_n echo "用户$u对应的数字是:$n" echo $u $n >> $f fi fi done
11、用shell实现,把一个文本文档中只有一个数字的行给打印出来。
#!/bin/bash while read line do n=`echo $line |sed 's/[^0-9]//g'|wc -L` if [ $n -eq 1 ] then echo $line fi done < 1.txt
12、系统logrotate工具,可以完成日志切割、归档。写一个shell脚本实现类似的归档功能。

举例: 假如服务的输出日志是1.log,要求每天归档一个,1.log第二天就变成1.log.1,第三天1.log.2, 第四天 1.log.3 一直到1.log.5。
#!/bin/bash cd /data/logs log=1.log mv_log() { [ -f $1 ] && mv $1 $2 } [ -f 1.log.5 ] && rm -f 1.log.5 for i in `seq 4 -1 1` do j=$[$i+1] mv_log $log.$i $log.$j done mv 1.log 1.log.1
13、写一个shell脚本,把192.168.0.0/24网段在线的ip列出来。
#!/bin/bash for i in `seq 1 254` do if ping -c 2 -W 2 192.168.0.$i >/dev/null 2>/dev/null then echo "192.168.0.$i 是通的." else echo "192.168.0.$i 不通." fi done
14、写一个shell脚本,检查指定的shell脚本是否有语法错误,若有错误,首先显示错误信息,然后提示用户输入q或者Q退出脚本,输入其他内容则直接用vim打开该shell脚本。
#!/bin/bash sh -n $1 2>/tmp/sh.err if [ $? -ne 0 ] then cat /tmp/sh.err read -p "请输入q/Q退出脚本。" c if [ -z "$c"] then vim $1 exit 0 fi if [ $c == q ] || [ $c == Q ] then exit 0 else vim $1 exit 0 fi else echo "脚本$1没有语法错误." fi
15、输入一串随机数字,然后按千分位输出。比如输入数字串为“123456789”,输出为123,456,789。
#!/bin/bash n=`echo $1|wc -L` for d in `echo $1|sed 's/./& /g'` do n2=$[$n%3] if [ $n2 -eq 0 ] then echo -n ",$d" else echo -n "$d" fi n=$[$n-1] done |sed 's/^,//' echo
16、编写一个问候程序,它执行时能根据系统当前的时间向用户输出问候信息。假设从半夜到中午为早晨,中午到下午六点为下午,下午六点到半夜为晚上。
#!/bin/bash d=`date +%H` if [ $d -ge 0 -a $d -lt 7 ] then tag=1 elif [ $d -ge 7 -a $d -lt 12 ] then tag=2 elif [ $d -ge 12 -a $d -lt 18 ] then tag=3 else tag=4 fi case $tag in 1) echo "早晨好" ;; 2) echo "上午好" ;; 3) echo "下午好" ;; 4) echo "晚上好" ;; *) echo "脚本出错啦" ;; esac
17、写一个shell脚本,实现简单的弹出式菜单功能,用户能根据显示的菜单项从键盘选择执行对应的命令。
#!/bin/bash PS3="Please input your choice(1-4): " select i in w ls pwd quit do case $i in w) w ;; ls) ls ;; pwd) pwd ;; quit) exit ;; *) echo "Please input 1-3." ;; esac done ``` #### 参考答案2 ``` #!/bin/bash echo -e "1) w\n2) ls\n3) pwd\n4) quit" while : do read -p "Please input your choice(1-4): " c case $c in 1) w ;; 2) ls ;; 3) pwd ;; 4) exit ;; *) echo "Please input 1-4." ;; esac done
18、写一个shell脚本,执行中每隔5分钟检查指定的用户是否登录系统,用户名从命令行输入,如果指定的用户已经登录,则显示相关信息。
#!/bin/bash while : do if w|sed '1'd|awk '{print $1}'|grep -qw "$1" then echo "用户$1 已经登录系统." exit fi sleep 300 done
19、先普及一个小常识,我们用ps aux可以查看到进程的PID,而每个PID都会在/proc内产生。如果查看到的pid在proc内是没有的,则进程被人修改了,这就代表系统很有可能已经被入侵过了。
请用上面知识编写一个shell,定期检查下自己的系统是否被人入侵过。
#!/bin/bash pp=$$ ps -elf |sed '1'd > /tmp/pid.txt for pid in `awk -v ppn=$pp '$5!=ppn {print $4}' /tmp/pid.txt` do if ! [ -d /proc/$pid ] then echo "系统中并没有pid为$pid的目录,需要检查。" fi done
20、想办法把文本里面每三行内容合并到一行

例如:1.txt内容

```
1
2
3
4
5
6
7
```
处理后应该是
```
1 2 3
4 5 6
7
```

#!/bin/bash n=1 cat $1 |while read line do n1=$[$n%3] if [ $n1 -eq 0 ] then echo "$line" else echo -n "$line " fi n=$[$n+1] done
21、写一个getinterface.sh 脚本可以接受选项[i,I],完成下面任务:

1)使用格式:getinterface.sh [-i interface | -I ip]

2)当用户使用-i选项时,显示指定网卡的IP地址;当用户使用-I选项时,显示其指定ip所属的网卡。

例:
sh getinterface.sh -i eth0 或者

sh getinterface.sh -I 192.168.0.1

3)当用户使用除[-i | -I]选项时,显示[-i interface | -I ip]此信息。

4)当用户指定信息不符合时,显示错误。(比如指定的eth0没有,而是eth1时)

#!/bin/bash ip add |awk -F ': ' '$1 ~ "^[1-9]" {print $2}' > /tmp/ifs.txt get_ip() { ip add show dev $1 |grep inet |awk '{print $2}' |awk -F '/' '{print $1}' } for eth in `cat /tmp/ifs.txt` do myip=`get_ip $eth` if [ -z "$myip" ] then echo $eth else echo $eth $myip fi done > /tmp/if_ip.txt if [ $# -ne 2 ] then echo "请输入正确的格式: bash $0 -i 网卡 或者 bash $0 -I ip" exit fi if [ $1 == "-i" ] then if awk '{print $1}' /tmp/if_ip.txt |grep -qw $2 then eth=$2 ip1=`awk -v aeth=$eth '$1==aeth' /tmp/if_ip.txt|sed "s/$eth //"` echo "网卡$2的ip是 $ip1" else echo "你指定的网卡不对,系统中的网卡有:`cat /tmp/ifs.txt|xargs`" exit fi elif [ $1 == "-I" ] then if grep -qw " $2 " /tmp/if_ip.txt then eth=`grep -w " $2 " /tmp/if_ip.txt|awk '{print $1}'` echo "IP $2对应的网卡是$eth" else echo "你指定的ip不对,系统中的IP有:`ip add |grep inet |awk '{print $2}'|awk -F '/' '{print $1}'|xargs`" exit fi else echo "请输入正确的格式: bash $0 -i 网卡 或者 bash $0 -I ip" fi
22、写一个脚本产生随机3位的数字,并且可以根据用户的输入参数来判断输出几组。 比如,脚本名字为 number3.sh。

执行方法:

1)bash number3.sh 会产生一组3位数字。

2)bash number3.sh 10 会产生10组3位数字。

#!/bin/bash get_number() { for i in `seq 0 2` do a[$i]=$[$RANDOM%10] done echo ${a[@]}|sed s'/ //g' } if [ $# -eq 0 ] then get_number elif [ $# -eq 1 ] then n=`echo $1|sed 's/[0-9]//g'` if [ -n "$n" ] then echo "给定的参数必须是一个数字" exit fi for i in `seq 1 $1` do get_number done |xargs else echo "格式不对,正确的是格式是sh $0 [n],这里的n是一个数字。" fi
23、写一个shell,先判断是否安装httpd和mysql,没有安装进行安装,安装了检查是否启动服务,若没有启动则需要启动服务。
#!/bin/bash if_install() { rpm -q $1 >/dev/null 2>/dev/null if [ $? -eq 0 ] then echo "$1已经安装" return 0 else echo "$1没有安装" return 1 fi } if_install httpd if [ $? -eq 0 ] then if ! pgrep httpd >/dev/null then service httpd start fi else yum install -y httpd fi if_install mysql-server if [ $? -eq 0 ] then if ! pgrep mysqld >/dev/null then service mysqld start fi else yum install -y mysql-server fi
24、用shell脚本判断输入的日期是否合法。

比如20170110就是合法日期,20171332就不合法。

#!/bin/bash if [ $# -ne 1 ] || [ ${#1} -ne 8 ] then echo "请输入正确的格式,sh $0 yyyymmdd" exit 1 fi y=`echo ${1:0:4}` m=`echo ${1:4:2}` d=`echo ${1:6:2}` if echo $d|grep -q "^0" then d=`echo ${1:6:2}|sed 's/^0//'` fi if cal $m $y >/dev/null 2>/dev/null then if ! cal $m $y|grep -qw "$d" then echo "你给的日期是不合法的" else echo "日期合法" fi else echo "你给的日期不合法" fi
25、写一个监控网卡的脚本,需要满足以下要求:

1. 每10分钟检测一次指定网卡的流量。

2. 如果流量为0,则重启网卡。

#!/bin/bash LANG=en sar -n DEV 1 10|grep -w "$1" > /tmp/sar.tmp in=`grep "Average:" /tmp/sar.tmp|awk '{print $5}'|sed 's/\.//'` out=`grep "Average:" /tmp/sar.tmp|awk '{print $6}'|sed 's/\.//'` if [ $in == "000" ] && [ $out == "000" ] then ifdown $1 ifup $1 fi


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/30 7:47:07

针对 DeepSeek V3.2 的推理引擎深度优化

本文整理自 2025 年 12 月 14 日的「百度百舸 X SGLang Meetup 北京站」的同名主题分享。 百度百舸基于万卡级生产系统实战经验&#xff0c;面向 DeepSeek V3.2 在推理引擎层面做了深度优化&#xff0c;加快推理速度&#xff0c;降低推理成本&#xff1a;通过轻量级 CP 让长文…

作者头像 李华
网站建设 2026/4/26 17:06:46

三大AI模型联动:多模态视频生成实战

多模态视频生成实战&#xff1a;三大AI引擎的深度协同 在内容创作进入“超高速迭代”时代的今天&#xff0c;单打独斗的AI模型早已无法满足专业级产出的需求。真正能撬动生产力变革的&#xff0c;是多个AI系统之间的智能分工与无缝协作。我们不再追求一个“全能冠军”&#xff…

作者头像 李华
网站建设 2026/4/23 17:53:10

XGW-9000网关DL/T 645协议接入引擎:面向新能源电站的标准化电表通信设计

一、新能源电站电表通信的核心痛点与技术诉求 随着光伏、风电等新能源电站的大规模并网&#xff0c;电站内部能源流、数据流的精细化管理成为提升电站收益、保障电网稳定运行的关键。电表作为能源计量与数据采集的核心设备&#xff0c;广泛分布于电站的光伏阵列、风机、汇流箱、…

作者头像 李华
网站建设 2026/5/1 7:27:46

Windows下安装配置EmotiVoice语音合成引擎

Windows下安装配置EmotiVoice语音合成引擎完整指南 在智能家居设备日益复杂的今天&#xff0c;确保无线连接的稳定性已成为一大设计挑战。然而&#xff0c;当我们把目光转向人机交互的另一端——声音输出时&#xff0c;会发现一个更深层的需求正在浮现&#xff1a;用户不再满足…

作者头像 李华
网站建设 2026/5/1 8:32:50

从入门到精通:LobeChat的文件上传与语音交互功能详解

LobeChat 的文件上传与语音交互&#xff1a;如何让 AI 真正“看懂”和“听懂” 在智能手机几乎成为人体延伸的今天&#xff0c;我们早已习惯了用语音发消息、拍照搜题、上传合同让 AI 总结重点。但你有没有想过&#xff0c;这些看似自然的操作背后&#xff0c;其实是一场人机交…

作者头像 李华
网站建设 2026/5/1 7:25:42

LangGraph持久化机制详解:让AI智能体拥有记忆能力,从入门到实践

本文详细介绍了LangGraph的持久化机制&#xff0c;通过Thread和Checkpoint概念&#xff0c;使AI智能体具备记忆能力。持久化机制支持多轮对话、状态恢复、人工介入和时间旅行等场景&#xff0c;提供了InMemorySaver、SqliteSaver、PostgresSaver和RedisSaver等多种实现方式。理…

作者头像 李华