Linux:这啥命令?这台服务器我说了算-Shell 脚本——“每天都敲一遍?我又不是打字员”
第八章:Shell 脚本——“每天都敲一遍?我又不是打字员。”
如果一条命令每天执行一次,手敲还能忍。
如果十条命令每天都要执行一次,那就不是勤奋了,那叫重复劳动上瘾。
Shell 脚本的价值很简单:
把一堆原本要手动执行的命令,交给脚本自动完成。
1. 第一个 Shell 脚本
新建文件:
vim hello.sh
写入:
#!/bin/bash
echo "Hello Linux"
date
whoami
赋予执行权限:
chmod +x hello.sh
执行:
./hello.sh
第一行:
#!/bin/bash
叫 Shebang,用来告诉系统:“这个脚本请用 Bash 来解释。”
2. 变量:别把内容写死
定义变量:
name="Linux"
使用:
echo "$name"
读取命令结果:
now=$(date)
user=$(whoami)
echo "当前时间:$now"
echo "当前用户:$user"
注意:
name = "Linux"
是错的,等号两边不能加空格。
3. 让脚本接收参数
写一个脚本:
#!/bin/bash
echo "脚本名:$0"
echo "第一个参数:$1"
echo "第二个参数:$2"
echo "参数数量:$#"
执行:
./test.sh nginx 8080
常用参数:
$0 脚本自身名称
$1 第一个参数
$2 第二个参数
$# 参数总数
$@ 所有参数
有了参数,同一个脚本就能干不同的活。
不然每次改脚本内容,多少有点像为了换频道去拆电视机。
4. if:让脚本学会判断
判断文件是否存在:
#!/bin/bash
file="/etc/passwd"
if [ -f "$file" ]; then
echo "文件存在"
else
echo "文件不存在"
fi
常见判断:
-f 是否为普通文件
-d 是否为目录
-e 是否存在
再结合前面学过的服务管理:
if systemctl is-active --quiet nginx; then
echo "Nginx 正常运行"
else
echo "Nginx 没起来"
fi
这已经很接近真实运维脚本了。
5. for:重复的事交给循环
创建多个目录:
for name in app log backup
do
mkdir -p "$name"
done
检查多个服务:
for service in nginx ssh cron
do
echo "检查:$service"
systemctl is-active "$service"
done
循环的核心思想就是:
同样的动作,别复制十遍,让机器自己重复。
6. while:条件没结束,就继续干
count=1
while [ "$count" -le 5 ]
do
echo "第 $count 次"
count=$((count + 1))
done
while 很适合:
- 重试
- 等待服务启动
- 定时检查
- 持续处理任务
但要小心死循环:
while true
do
echo "我还能再跑五百年"
done
除非你就是故意的。
7. 退出码:程序到底成功没?
查看上一条命令的退出码:
echo $?
通常:
0 成功
非 0 失败
脚本里可以主动退出:
exit 0
或者表示失败:
exit 1
所以判断命令有没有成功,不一定非要“看输出”。机器更喜欢看退出码。
8. && 和 ||:简单判断神器
前面成功才执行后面:
mkdir demo && cd demo
前面失败才执行后面:
ping -c 1 127.0.0.1 || echo "网络测试失败"
组合:
systemctl is-active --quiet nginx \
&& echo "Nginx 正常" \
|| echo "Nginx 异常"
简单逻辑很好用,复杂逻辑还是老老实实写 if,别把一行命令写成密码学论文。
9. 实战:写一个服务器巡检脚本
创建:
vim check.sh
写入:
#!/bin/bash
echo "===== Linux 巡检 ====="
echo "[当前时间]"
date
echo "[运行用户]"
whoami
echo "[磁盘使用]"
df -h /
echo "[内存使用]"
free -h
echo "[系统负载]"
uptime
echo "[Nginx 状态]"
if systemctl is-active --quiet nginx; then
echo "Nginx:正常"
else
echo "Nginx:异常"
fi
赋权并运行:
chmod +x check.sh
./check.sh
保存结果:
./check.sh > report.txt
追加结果:
./check.sh >> report.txt
现在,你已经把“看时间、看用户、看磁盘、看内存、看负载、看服务”变成了一键体检。
10. 脚本调试
检查语法:
bash -n check.sh
查看执行过程:
bash -x check.sh
建议写完先跑一次:
bash -n 脚本名
至少先抓住明显语法错误。
11. 本章挑战
写一个 service_check.sh,要求:
- 接收服务名作为第一个参数
- 没传参数就提示用法
- 检查服务是否运行
- 正常输出“运行中”
- 异常输出“未运行”
- 返回合适的退出码
参考:
#!/bin/bash
service=$1
if [ -z "$service" ]; then
echo "用法:$0 服务名"
exit 1
fi
if systemctl is-active --quiet "$service"; then
echo "$service:运行中"
exit 0
else
echo "$service:未运行"
exit 1
fi
执行:
./service_check.sh nginx
到这里,你已经不只是“会敲 Linux 命令”了。
你开始让 Linux:
替你敲命令。
本章速查
chmod +x script.sh
./script.sh
name="Linux"
echo "$name"
echo "$1"
echo "$#"
echo "$@"
if [ -f file ]; then
echo "存在"
fi
for item in a b c
do
echo "$item"
done
echo $?
exit 0
exit 1
command1 && command2
command1 || command2
bash -n script.sh
bash -x script.sh
下一章:
《第九章:定时任务——“凌晨三点的活,为什么要我醒着干?”》
- 点赞
- 收藏
- 关注作者
评论(0)