Linux:这啥命令?这台服务器我说了算-Shell 脚本——“每天都敲一遍?我又不是打字员”

举报
yd_240046519 发表于 2026/11/03 10:29:17 2026/11/03
【摘要】 第八章:Shell 脚本——“每天都敲一遍?我又不是打字员。”如果一条命令每天执行一次,手敲还能忍。如果十条命令每天都要执行一次,那就不是勤奋了,那叫重复劳动上瘾。Shell 脚本的价值很简单:把一堆原本要手动执行的命令,交给脚本自动完成。 1. 第一个 Shell 脚本新建文件:vim hello.sh写入:#!/bin/bashecho "Hello Linux"datewhoami赋...

第八章: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,要求:

  1. 接收服务名作为第一个参数
  2. 没传参数就提示用法
  3. 检查服务是否运行
  4. 正常输出“运行中”
  5. 异常输出“未运行”
  6. 返回合适的退出码

参考:

#!/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

下一章:

《第九章:定时任务——“凌晨三点的活,为什么要我醒着干?”》

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。