一、为什么自动化阶段先学 Shell

原始笔记一开始就强调了两点:

  • Shell 在 Linux 运维里应用极广,可以说占据了大量日常操作场景。
  • 企业对应聘者的要求也很明确,运维岗位通常默认要具备 Shell 编程能力。

这门课给出的学习目标也很直接:

  • 能写出 100 行以上的脚本。
  • 能把脚本用到系统巡检、系统加固、系统初始化、Nginx 优化、Tomcat 优化等场景。
  • 通过持续读写脚本,把自动化能力真正落到工作里。

课程整体路径是先讲 Shell 基础,再讲变量、判断、循环、函数、数组,以及和三剑客结合后的实战案例。

二、Shell 常见命令解释器

Shell 脚本首先要有解释器。原笔记列出了几种常见选择:

  • bash:目前应用最广的解释器,红帽系默认使用它,也是运维脚本最常见的目标环境。
  • dash:Debian/Ubuntu 常见默认解释器之一,但很多脚本能力不如 bash 完整。
  • cshtcsh:更多见于某些 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 直接用 shbash

这是最常见的运行方式:

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 发行版之间切换时。

这些看起来只是细节,但几乎决定了后面自动化脚本是否容易调试、迁移和维护。