Shell是Linux系统的命令解释器,是用户与操作系统内核之间交互的桥梁。简单来说,Shell接收用户输入的命令,将其交给内核执行,并将结果返回给用户
我们可以把Shell想象成一个翻译官:你用人类语言(命令)告诉它“你想做什么”,它翻译成计算机能理解的指令交给内核执行,再把结果翻译回来告诉你。没有Shell,你只能面对黑乎乎的底层系统调用接口,效率低效
在Linux世界里,提供了许多不同类型的Shell,每一种都有其独特的特点和适用场景
主流Shell类型对比:
| Shell类型 | 特点 | 默认系统 |
|---|---|---|
| bash | 功能最全面,脚本兼容性好,行业标准 | CentOS/RHEL/Fedora默认 |
| sh | 早期标准,功能较少,bash的子集 | 被bash兼容替代 |
| zsh | 交互体验优秀,插件丰富,脚本兼容bash | macOS默认(Catalina后) |
生产环境选择: 绝大多数企业服务器使用bash,本文章基于bash编写,因为bash兼容性好、生态成熟、所有Linux发行版都预装,你写的脚本可以在任何服务器上运行,不需要额外安装依赖
需要注意的是,有些老旧系统上/bin/sh是一个简化版的Shell,不支持bash的高级特性(如数组、‘[[]]’条件、字符串操作等)。为了保险起见,脚本的第一行始终写成#!/bin/bash
用一句话总结就是:能用Shell脚本做的事,就不要手工去做。这是运维提高效率的第一工具,脚本不仅快,还能避免认为操作失误,每执行一次都是标准化的结果
bash展开代码#!/bin/bash
# 表示使用/bin/bash解释器执行脚本
# 如果没有这行,Linux会使用默认shell(通常也是bash)
这行代码基本是必写的。因为你可能会把脚本交给不同的人运行,有人用zsh,有人用sh,千奇百怪的默认Shell可能会导致脚本行为不一致,比如zsh的某些语法就和bash不同,你的脚本在bash下跑得好好的,到了zsh下就报错了
写上#!/bin/bash就强制使用bash解释器,确保脚本在任何环境下的行为都一致
.shdeplay_app.sh好的命名习惯:用动词开头说明功能,比如create_user.sh会比user.sh更直观;backup_db.sh会比backup.sh更能体现具体用途。当你目录下有几十个脚本的时候,规范的命名能让你快速找到想要的脚本
| 执行方式 | 命令 | 特点 | 适用场景 |
|---|---|---|---|
| 方式一 | bash script.sh | 直接运行,无需执行权限 | 调试开发 |
| 方式二 | ./script.sh | 需chmod +x script.sh先给权限 | 生产部署 |
| 方式三 | source script.sh 或 . script.sh | 在当前shell环境执行 | 加载环境变量 |
关键区别
bash展开代码# 方式一、二:启动子shell执行,脚本中的变量不会影响当前shell
# 方式三:在当前shell执行,变量会保留到当前shell
bash test.sh
source test.sh # 等同 .test.sh
其中的区别,可以想象下shell是独立的房间,你进去做了什么事,出来后就都消失了(变量不保留,工作目录不保留)。而source是在你当前所在的房间直接操作,所有改变都会留下
所以当你需要让脚本修改当前环境(比如设置JAVA_HOME、添加快捷命令),就必须用source;如果只是执行一个单独的任务(如备份文件),用前两种方式即可
bash展开代码chmod 755 script.sh # 所有者读写执行,组合其他人读执行
chmod +x script.sh # 给所有人增加执行权限
权限非常重要,如果你的脚本的权限为777(所有人都能修改),那一旦被植入恶意代码(如rm -rf /*),那就有点好玩了[dogo],生产环境安全的第一道防线就是权限控制
安全提醒: 生产环境不要给脚本777权限!755就足够了
bash展开代码#!/bin/bash
#=============================================
# 作者:您的名字
# 日期:2024-01-01
# 功能:批量创建系统用户
# 版本:v1.0
# 注意事项:需要root权限运行,uid从1001开始
#=============================================
# 单行注释使用#
:<<BLOCK
多行注释区块
可以写多行说明
BLOCK
重要提醒: 一段时候后回头看自己写的脚本,如果没有注释,很可能看不懂自己在写什么(或者发给AI问问[dogo])。一个合格的脚本头部至少应该包含:作者、日期、功能、使用方法、注意事项
对于多行注释,:<<EOF格式的好处就是可以写大段说明文档而不影响脚本执行,适合写在函数前面说明函数的用户和参数含义
输出的脚本的“嘴巴”,没有输出的脚本就是黑盒子,你完全不知道它内部究竟发生了什么,所以,脚本的每一步关键操作都必须要有输出信息
本文作者:zzz
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!