您的当前位置:首页 > 焦点 > linuxshell脚本编程入门 正文

linuxshell脚本编程入门

时间:2026-10-17 04:37:04 来源:网络整理 编辑:焦点

核心提示

第一次写 shell 脚本,很多人是在凌晨两点。服务器上某个日志文件把磁盘撑爆了,你一边删文件一边想:下次能不能让机器自己干这事?答案就在 /bin/bash 里。 Linux 的 shell 脚本本

第一次写 shell 脚本,脚本很多人是编程在凌晨两点。服务器上某个日志文件把磁盘撑爆了,入门你一边删文件一边想:下次能不能让机器自己干这事?脚本答案就在 /bin/bash 里。

Linux 的编程 shell 脚本本质上就是把你在终端里敲的命令,按顺序写进一个文本文件。入门没有编译,脚本没有复杂的编程依赖,chmod +x 之后就能跑。入门这点跟 Python 或 Go 很不一样——你不需要装运行时,脚本因为 bash 本身就是编程运行时。几乎每台 Linux 机器都有它。入门

从一个真实的脚本脚本开始

假设你要每天清理 /var/log/myapp 下超过 7 天的日志。手敲命令是编程这样:

find /var/log/myapp -name "*.log" -mtime +7 -delete

把它包成脚本,加上一点判断:

#!/bin/bash LOG_DIR="/var/log/myapp" if [ ! -d "$LOG_DIR" ]; then echo "目录不存在: $LOG_DIR" exit 1 fi find "$LOG_DIR" -name "*.log" -mtime +7 -delete echo "清理完成: $(date)"

第一行的入门 #!/bin/bash 叫 shebang,告诉系统用哪个解释器执行这个文件。少了它,脚本可能被当成普通文本。变量赋值等号两边不能有空格,这是新手最常踩的坑——LOG_DIR = "/var/log" 会直接报错。

变量、引号、和那些让人抓狂的空格

bash 的变量默认都是字符串,不需要声明类型。引用变量用 $,但建议写成 ${ LOG_DIR},尤其在拼接字符串的时候更安全。引号这件事值得单独说:双引号里的变量会被展开,单引号里原样输出。"$DIR" 和 $DIR 在大多数场景下结果一样,但当变量里含空格时,不加引号会被拆成多个参数。我见过一个脚本因为路径里有空格,把整个目录删错了位置。

条件判断和循环

if 语句在 bash 里长得有点怪,方括号 [ ] 其实是一个命令(test 的别名),所以括号内侧必须有空格。[ -f file ] 判断文件是否存在,[ -z "$str" ] 判断字符串是否为空。数值比较用 -eq、-gt,字符串比较用 = 和 !=。别搞混了。

循环处理文件列表时,for f in *.log 很方便,但如果文件名里有空格就会出问题。更稳妥的写法是:

find . -name "*.log" -print0 | while IFS= read -r -d '' file; do echo "处理: $file" done

这段代码看起来啰嗦,但它能正确处理任意文件名。写运维脚本时间长了,你会越来越偏向这种“防御性”写法。

函数和参数

脚本里定义函数跟其他语言差不多:

backup() {  local src="$1" local dst="$2" tar -czf "$dst" "$src" }

$1、$2 是函数参数,local 限定变量作用域。脚本本身的参数也用 $1 访问,$# 是参数个数,$@ 是全部参数。写一个带 -h 帮助信息的脚本,是让别人愿意用你脚本的最低成本。

调试和习惯

脚本出问题时,bash -x script.sh 会打印每一行执行过程,比 echo 大法高效得多。另外在脚本开头加 set -euo pipefail 是个好习惯:命令出错就退出,未定义变量报错,管道中任一环节失败都算失败。这三条能帮你避开大量隐蔽 bug。

shell 脚本不适合写大型程序,超过两三百行就该考虑 Python 了。但做系统管理、定时任务、部署钩子,它依然是最高效的工具。你不需要成为 bash 专家,掌握变量、条件、循环、函数这四样,日常运维里八成的自动化需求就覆盖了。剩下的,遇到再查。