2025-05-27 03:44:101034
每天分享技术栈,开发工具等
文章篇幅较长,建议收藏+转发,慢慢啃!只要认真跟着练,保证你能学会 Shell 脚本,脱离“看得懂却写不出”的尴尬!
你是不是也听说过 Shell 脚本很重要?
你是不是也尝试看过几篇博客、视频,感觉懂了,但真让你写一个脚本,又开始挠头?
我以前就是那种“死记硬背一堆命令+if判断”的人,结果还是不会写。后来我换了一种方式——「一行一行去理解、去写、去调试」。
这篇文章,我不讲虚的,就从最基础的 #!/bin/bash开始,一步一步带你写出自己的第一个 Shell 脚本。就算你现在一点都不懂 Linux,也能看懂!
本文环境:
系统:Almalinux 8.5(三台机器 master、node1、node2)用户:普通 DBA 想搞运维脚本目标:搞定 Shell 脚本入门、能自己写逻辑清晰的小工具第一步:从一行开始,写一个最简单的脚本代码语言:javascript代码运行次数:0运行复制#!/bin/bash
echo"你好,Shell 脚本!"
这一段你可以直接复制进一个文件里,比如:
代码语言:javascript代码运行次数:0运行复制vim hello.sh
然后把上面的内容贴进去,保存退出。
接着让它可以执行:
代码语言:javascript代码运行次数:0运行复制chmod +x hello.sh
最后执行它:
代码语言:javascript代码运行次数:0运行复制./hello.sh
你会看到输出:
代码语言:javascript代码运行次数:0运行复制你好,Shell 脚本!
这一刻,你已经写出了你的第一个 Shell 脚本,别小看它,它比你手动敲命令强多了。
第二步:变量是灵魂,一定要会用!什么是变量?你可以把它当成“一个代号”,我们来试试:
代码语言:javascript代码运行次数:0运行复制#!/bin/bash
name="小白DBA"
echo"你好,$name"
保存为 var.sh,加权限,执行试试。
重点来了:
name="小白DBA"赋值不能有空格!echo "你好,$name"双引号里可以展开变量如果你写成 echo '你好,$name',变量不会被替换哦第三步:加点判断,Shell 也能做选择题!最常见的场景,比如判断文件是否存在:
代码语言:javascript代码运行次数:0运行复制#!/bin/bash
if [ -f /etc/passwd ]; then
echo"文件存在"
else
echo"文件不存在"
fi
说明:
-f是判断文件是否存在且为普通文件[]是条件测试,里面记得两边要有空格then和 fi是 Shell 的标志性写法(fi = if 的反着)再比如用户输入判断:
代码语言:javascript代码运行次数:0运行复制#!/bin/bash
read -p "请输入你的名字:" yourname
if [ "$yourname" == "root" ]; then
echo"你好,管理员!"
else
echo"你好,$yourname"
fi
第四步:循环很重要,自动批量操作全靠它!我们写个脚本,一次性 ping 多个主机:
代码语言:javascript代码运行次数:0运行复制#!/bin/bash
for ip in 192.168.1.{1..5}
do
ping -c 1 $ip > /dev/null
if [ $? -eq 0 ]; then
echo"$ip 通了"
else
echo"$ip 不通"
fi
done
这段代码你要掌握:
for ... in是标准写法{1..5}会展开成 1 到 5$?是上一条命令的返回值,0 表示成功> /dev/null是为了不输出 ping 的详细内容第五步:函数登场,模块化开始把常用逻辑封装起来,反复用:
代码语言:javascript代码运行次数:0运行复制#!/bin/bash
check_port() {
if ss -tunlp | grep ":$1" > /dev/null; then
echo"端口 $1 正在监听"
else
echo"端口 $1 未打开"
fi
}
check_port 22
check_port 80
说明:
check_port是一个函数$1表示第一个参数你可以调用很多次,逻辑很清晰第六步:真实案例,写个服务状态检查工具代码语言:javascript代码运行次数:0运行复制#!/bin/bash
SERVICES=("sshd""mysqld""nginx")
for svc in"${SERVICES[@]}"
do
systemctl is-active --quiet $svc
if [ $? -eq 0 ]; then
echo"$svc 运行中"
else
echo"$svc 没有运行"
fi
done
解释一下:
SERVICES是一个数组${SERVICES[@]}是遍历方式systemctl is-active可以检测服务状态--quiet是静默模式,不输出内容第七步:用户交互 + 输入参数,做成通用工具你可以让脚本接收外部参数,例如:
代码语言:javascript代码运行次数:0运行复制#!/bin/bash
if [ $# -lt 1 ]; then
echo"用法:$0 <文件路径>"
exit 1
fi
file=$1
if [ -f "$file" ]; then
echo"$file 是一个文件"
else
echo"$file 不存在"
fi
说明:
$#表示参数数量$0是脚本名$1是第一个参数exit 1表示退出并提示错误第八步:调试技巧,别再瞎猜了!有时候脚本不工作,我们可以这样加 -x:
代码语言:javascript代码运行次数:0运行复制bash -x myscript.sh
这样会显示每一步执行过程,变量展开也能看到,超级有用!
还可以手动在脚本中加入:
代码语言:javascript代码运行次数:0运行复制set -x # 开始调试
set +x # 关闭调试
「接下来怎么学?」
建议你试着写几个自己的小脚本,比如:
批量备份某目录下的文件每天定时清理日志(配合 crontab)监控磁盘占用,超过 80% 就发邮件/日志报警用 Shell 实现一个简单的菜单交互脚本