Shell 概述
《Shell 概述》
🖥️ 学习目标
- 全面理解 Shell 的概念、作用及其在 Linux 系统中的核心地位。
- 掌握 Shell 脚本的基本语法结构和执行方式,了解脚本的运行机制。
- 学会使用 Windows 编写 Shell 脚本并上传到 Ubuntu ECS 执行,解决常见兼容性问题(如换行符不同)。
- 熟悉 Shell 脚本调试技巧与错误排查方法,为后续编写自动化运维脚本打下坚实基础。
🧠 核心重点(表格提炼)
| 内容 | 说明 |
|---|---|
| Shell 是什么? | 用户与内核之间的接口,用于解释和执行命令或脚本 |
| Shell 脚本是什么? | 包含多个 Shell 命令的文本文件,可被一次性执行 |
| 常见 Shell 类型 | bash(默认)、zsh、fish、dash |
| Shell 脚本基本结构 | #!/bin/bash + 命令列表 |
| Windows 上传脚本问题 | 换行符为 \r\n,Linux 需要 \n,需转换格式 |
| 解决方案 | 使用 dos2unix 工具或 sed 命令处理换行符 |
| 脚本执行方式 | chmod +x script.sh + ./script.sh 或 bash script.sh |
🔍 详细讲解
1. Shell 是什么?🧐
Shell 是一个命令行解释器(CLI),它接收用户输入的命令,将其翻译成操作系统能理解的语言,并调用相应的程序执行。
📌 你可以把它想象成:
- 一个“翻译官”🧑🏫
- 一个“指挥官”🎖️ —— 控制系统资源、管理进程、操作文件等
📌 Shell 的主要功能包括:
- 执行单条命令(如
ls,cp,grep) - 执行脚本(批量执行多条命令)
- 支持变量、条件判断、循环、函数等编程特性
- 提供管道、重定向、后台执行等功能
2. Shell 脚本是什么?📄
Shell 脚本就是将一系列 Shell 命令写入一个文本文件中,并赋予其可执行权限,从而实现自动化任务的一种方式。
📌 脚本的第一行必须指定解释器路径:
#!/bin/bash
📌 示例脚本:
#!/bin/bash
echo "Hello, Alibaba Cloud!"
echo "当前时间是:$(date)"
📌 保存为 hello.sh 后执行:
chmod +x hello.sh
./hello.sh
📌 注意事项:
- 文件名建议以
.sh结尾(非强制) - 必须赋予执行权限后才能运行
- 若未指定解释器,可使用
bash hello.sh直接运行
3. Shell 脚本语法图谱 🗺️
+---------------------+
| Shell Script |
+---------------------+
| #!/bin/bash | ← 指定解释器
| |
| # 注释 | ← 注释部分(可选)
| |
| var="value" | ← 变量赋值
| echo $var | ← 使用变量
| |
| if [ condition ]; then |
| commands | ← 条件判断
| fi |
| |
| for i in {1..5}; do |
| commands | ← 循环结构
| done |
| |
| function myfunc() { |
| commands | ← 自定义函数
| } |
+---------------------+
📌 关键语法元素:
- 变量赋值与引用
- 控制结构(if/for/while)
- 函数定义与调用
- 命令替换(
$(cmd)) - 输入输出重定向(
>、>>、<) - 管道符(
|)
4. 实战案例:ECS 上的 Shell 初体验 🛠️
场景一:从 Windows 编写脚本上传到 Ubuntu ECS 并执行 📁
你使用 Windows 编写了一个简单的 Shell 脚本,准备上传到阿里云 Ubuntu ECS 并运行。
✅ 步骤如下:
- 在 Windows 上用记事本或 VSCode 创建
test.sh:
#!/bin/bash
echo "欢迎来到 Shell 世界!"
- 使用 WinSCP、FileZilla 或
scp命令上传脚本到服务器:
scp test.sh ubuntu@你的ECS公网IP:/home/ubuntu/
- 登录服务器查看脚本内容:
cat test.sh
- 尝试运行脚本:
chmod +x test.sh
./test.sh
📌 可能出现的问题:
-bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory
📌 原因分析:
- Windows 中换行符是
\r\n,而 Linux 只识别\n - 多出的
\r字符导致 Shell 无法正确解析第一行的解释器路径
场景二:解决 Windows 脚本上传到 Linux 无法运行的问题 💥
✅ 方法一:使用 dos2unix 工具自动转换格式(推荐):
- 安装
dos2unix(Ubuntu 默认未安装):
sudo apt update
sudo apt install dos2unix
- 转换文件格式:
dos2unix test.sh
- 再次运行脚本即可成功。
✅ 方法二:使用 sed 替换所有 \r 字符:
sed -i 's/\r$//' test.sh
✅ 方法三:使用 vim 手动编辑并保存:
vim test.sh
进入编辑器后,输入以下命令进行转换:
:set fileformat=unix
:wq
📌 小贴士:
- 如果你在 Windows 上使用 VSCode,可以点击右下角的
CRLF,切换为LF再保存。 - 使用 Git Bash 或 WSL 编写的脚本通常不会出现这个问题。
场景三:Shell 脚本调试技巧 🐞
你想确保脚本能正常运行,避免误操作或逻辑错误。
✅ 方法一:启用调试模式(打印每一步执行过程):
bash -x test.sh
✅ 方法二:在脚本中插入 set -x 和 set +x:
#!/bin/bash
set -x # 开启调试
echo "正在执行..."
set +x # 关闭调试
✅ 方法三:使用 trap 捕获错误信息:
trap 'echo "出错啦!在第 $LINENO 行"; exit 1' ERR
🧰 小贴士(进阶技巧)🔖
| 技巧 | 说明 |
|---|---|
which bash |
查看当前使用的 bash 路径 |
env |
显示当前环境变量 |
source script.sh |
在当前 Shell 中运行脚本(不新开子 Shell) |
| `$ | 技巧 |
| ------ | ------ |
which bash |
查看当前使用的 bash 路径 |
env |
显示当前环境变量 |
source script.sh |
在当前 Shell 中运行脚本(不新开子 Shell) |
| 当前 Shell 的 PID | |
$0 |
当前脚本名称 |
$1, $2, ... |
传递给脚本的第一个、第二个参数 |
$# |
参数个数 |
$? |
上一条命令的退出状态码(0 表示成功) |
!! |
重复上一条命令 |
!$ |
引用上一条命令的最后一个参数 |
📌 注意事项与安全建议
| 项目 | 建议 |
|---|---|
| 不要随意运行不明来源的 Shell 脚本 | 可能包含恶意代码 |
| 赋予脚本执行权限前务必检查内容 | 使用 cat 或 vim 查看 |
| 避免直接在生产环境运行未经测试的脚本 | 应先在测试环境中验证 |
| 脚本中涉及敏感操作应加确认提示 | 如删除文件时加 read -p "确定吗?" |
| 设置合理的权限保护脚本文件 | 如 chmod 600 script.sh |
使用 exit 终止脚本时注意逻辑完整性 |
避免遗漏清理步骤 |
🧩 附录:Shell 脚本模板(可用于日常开发)
#!/bin/bash
# 脚本名称:backup.sh
# 功能描述:备份指定目录并压缩为 tar.gz 文件
# 作者:Linux 专家
# 日期:2025-06-17
# 设置变量
SRC_DIR="/var/log"
BACKUP_DIR="/home/ubuntu/backups"
TIMESTAMP=$(date +"%Y%m%d%H%M")
# 创建备份目录(如果不存在)
mkdir -p "$BACKUP_DIR"
# 打包压缩
tar -czf "${BACKUP_DIR}/logs_${TIMESTAMP}.tar.gz" "$SRC_DIR"
# 输出结果
echo "备份完成,存放在:${BACKUP_DIR}/logs_${TIMESTAMP}.tar.gz"
📌 执行方式:
chmod +x backup.sh
./backup.sh
🎯 总结一句话:
“Shell 脚本就像是一把魔法棒🪄 —— 它能让你轻松地控制 Linux 系统、自动化重复工作、提高效率,是你迈向高级运维工程师不可或缺的核心技能!”
是否继续下一章?我将继续输出:
- 《Shell 命令进阶与自动化脚本》🖥️
- 《Linux 权限管理与 ACL 详解》🔐
- 《Linux 日志分析与排错技巧》🔍
请告诉我你想深入的方向吧!🚀

浙公网安备 33010602011771号