一、为什么自动化阶段先学 Shell¶
原始笔记一开始就强调了两点:
- Shell 在 Linux 运维里应用极广,可以说占据了大量日常操作场景。
- 企业对应聘者的要求也很明确,运维岗位通常默认要具备 Shell 编程能力。
这门课给出的学习目标也很直接:
- 能写出 100 行以上的脚本。
- 能把脚本用到系统巡检、系统加固、系统初始化、Nginx 优化、Tomcat 优化等场景。
- 通过持续读写脚本,把自动化能力真正落到工作里。
课程整体路径是先讲 Shell 基础,再讲变量、判断、循环、函数、数组,以及和三剑客结合后的实战案例。
二、Shell 常见命令解释器¶
Shell 脚本首先要有解释器。原笔记列出了几种常见选择:
bash:目前应用最广的解释器,红帽系默认使用它,也是运维脚本最常见的目标环境。dash:Debian/Ubuntu 常见默认解释器之一,但很多脚本能力不如bash完整。csh、tcsh:更多见于某些 Unix 系统。zsh:插件生态更丰富,交互体验更强,但运维脚本里仍以bash为主。
因此,原笔记特别提醒:在 Ubuntu 上执行 .sh 脚本时,尽量显式使用 bash script.sh,不要想当然地交给 sh。
三、解释型语言和编译型语言有什么区别¶
原笔记把编程语言按执行方式分成两类:
- 解释型:Shell、Python、PHP 这类代码写完后,交给解释器即可直接运行。
- 编译型:C、C++、Java、Golang 这类代码通常需要先编译,再执行产物。
解释型语言的典型示例:
cat /server/scripts/show.py
print("hello world hello oldboy")
python /server/scripts/show.py
编译型语言的典型示例:
cat /server/scripts/show.c
#include "stdio.h"
void main() {
printf("hello world c lang hello oldboy lidao");
}
gcc /server/scripts/show.c -o /server/scripts/show.bin
/server/scripts/show.bin
对运维人员来说,这个区别的意义在于:Shell 是“写完就能立即验证”的语言,特别适合快速自动化和命令编排。
四、Shell 开发环境如何准备¶
原笔记给出的实验环境重点有三项:
- 主机:
oldboy01 - 代码目录:
/server/scripts/devops-shell - 编辑器:
vim或其他编辑器
其中最有实操价值的是 vim 自动补全脚本头部信息的配置。可以在 /etc/vimrc 里加入:
set ignorecase
autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()"
function! SetTitle()
if expand("%:e") == 'sh'
call setline(1, "#!/bin/bash")
call setline(2, "#########################################")
call setline(3, "# File Name:".expand("%"))
call setline(4, "# Version:V1.0")
call setline(5, "# Author:zq")
call setline(6, "# Desc:")
call setline(7, "#########################################")
endif
endfunction
这样新建 .sh 文件时,就会自动带上脚本头,后续写脚本时更规范,也更方便维护。
五、Shell 脚本常见的 4 种执行方式¶
原笔记把执行方式分成 4 类。
5.1 直接用 sh 或 bash¶
这是最常见的运行方式:
cat /server/scripts/01.show-v3.sh
#!/bin/bash
hostname
bash /server/scripts/01.show-v3.sh
在非红帽系统里,优先使用 bash 更稳妥。
5.2 用 source 或 . 加载脚本¶
这种方式常用于让配置在当前 Shell 生效,也经常被拿来实现类似 include 的效果:
source /server/scripts/01.show-v3.sh
. /server/scripts/01.show-v3.sh
它的典型场景不是普通批处理,而是:
- 重新加载环境变量
- 引入函数库
- 让别名或变量直接作用于当前会话
5.3 用相对路径或绝对路径执行¶
这种方式通常要求脚本已经有执行权限:
cd /server/scripts/
chmod +x 01.show-v3.sh
./01.show-v3.sh
/server/scripts/01.show-v3.sh
原笔记提醒,这种方式在系统脚本或服务调用自定义脚本时更常见。
5.4 通过输入重定向执行¶
这种方式不常用,但需要知道:
sh </server/scripts/01.show-v3.sh
它本质上是把脚本内容喂给 sh 解释执行。
六、#! shebang 到底是什么意思¶
很多人初学时会把 #! 当作普通注释,其实它更重要的意义是:指定脚本默认解释器。
常见写法包括:
#!/bin/bash#!/usr/bin/python2#!/usr/bin/env python2
对 Shell 脚本来说,#!/bin/bash 是最常见也最直接的选择。只要脚本需要被系统、服务、计划任务或其他程序直接调用,就应该把 shebang 写清楚。
七、这一阶段真正要建立的习惯¶
在正式学习变量、判断、循环之前,先把下面 3 个习惯养成,后面会轻松很多:
- 新脚本统一写 shebang。
- 统一在固定目录管理脚本,例如
/server/scripts/devops-shell。 - 执行脚本时优先明确解释器,尤其是在不同 Linux 发行版之间切换时。
这些看起来只是细节,但几乎决定了后面自动化脚本是否容易调试、迁移和维护。