Shell 编程快速入门指南
一、Shell 基础概念
1.1 什么是 Shell
Shell 是一个命令解释器,它的核心作用是解释执行用户输入的命令及程序。用户在命令行输入的每一条指令,都由 Shell 接收并解释执行。
- 交互模式:用户输入一条命令,Shell 立即解释执行并返回结果的对话方式
- 系统接口:Shell 位于操作系统外层,负责用户与系统内核间的通信
- 不同系统的默认 Shell:
- Linux:Bourne Again shell (bash)
- Solaris/FreeBSD:Bourne shell (sh)
- AIX:Kom Shell (ksh)
1.2 什么是 Shell 脚本
当一系列命令或程序语句不在命令行直接执行,而是通过程序文件执行时,该文件被称为 Shell 脚本。
- 非交互方式:通过文件一次性执行多条命令和语句
- 功能强大:结合命令、变量和流程控制语句形成自动化脚本
- 类似概念:类似于 Windows 中的批处理程序 (
*.bat
)
二、为什么要学习 Shell 编程
2.1 Shell 编程的应用价值
- 文本处理优势:擅长处理纯文本数据
- Linux 系统中绝大多数配置文件、日志文件都是文本格式
- 适合处理 NFS、Rsync、Httpd、Nginx 等服务的配置和日志
- 自动化运维:系统管理和自动化运维的核心工具
- 检查多台服务器运行状态
- 自动化部署和升级服务器
- 日常运维任务自动化
- 职业发展:合格 Linux 管理员/运维工程师的必备技能
- 能够熟练编写 Shell 脚本
- 能够阅读和理解系统及软件附带的脚本
2.2 学习 Shell 编程的基础要求
- 编辑器熟练:熟练使用 vim 编辑器及配置(如
.vimrc
) - Linux 命令:掌握常用 Linux 命令并能熟练使用
- 文本处理:熟练掌握正则表达式及三剑客(grep、sed、awk)
- 系统知识:熟悉 Linux 网络服务部署、优化和故障排查
2.3 如何有效学习 Shell 编程
核心方法:多练习 → 多思考 → 多总结 → 循环反复
具体建议:
- 掌握 Shell 脚本基本语法
- 从简单判断和循环开始练习
- 多模仿、多练习、多思考
- 变量命名规范(推荐驼峰命名法)
- 理解而非简单复制代码
- 形成自己的脚本开发风格
2.4 脚本语言分类
Shell 是弱类型语言(无需预先定义变量类型)
Unix/Linux 中主要 Shell 类型:
- Bourne shell 系列
- sh:Bourne shell
- ksh:Kom shell
- bash:Bourne Again shell(Linux 默认)
- C shell 系列
- csh:由 Berkeley 大学开发,类 C 语言语法
- tcsh:csh 的增强版,增加命令补全等功能
三、创建第一个 Shell 脚本
3.1 脚本编写基础
3.1.1 脚本开头(Shebang)
必须在脚本第一行指定解释器:
#!/bin/bash
或
#!/bin/sh
#!
称为幻数,内核根据其后内容确定脚本解释器- 必须位于脚本第一行(否则视为注释)
- 规范写法推荐使用
#!/bin/bash
3.1.2 脚本注释
- 使用
#
符号添加注释 - 注释可独立成行或跟在命令后
- 注释内容不会被解释执行
- 重要:尽量避免使用中文注释
3.1.3 bash 与 sh 的关系
$ ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 11月 2 17:33 /bin/sh -> bash
- sh 是 bash 的软链接
- 大多数情况下
#!/bin/bash
和#!/bin/sh
无区别 - 规范写法推荐使用
#!/bin/bash
3.2 Shell 脚本的执行方式
3.2.1 脚本执行流程
Shell 脚本执行时:
- 查找系统环境变量 ENV
- 加载环境变量文件
- 从上至下、从左至右执行命令
- 遇到子脚本先执行子脚本内容
3.2.2 四种执行方式
-
使用 bash/sh 命令执行
bash
bash script.sh sh script.sh
- 适用于脚本无执行权限或未指定解释器的情况
-
直接执行脚本(需要执行权限)
bash
chmod +x script.sh # 添加执行权限 /path/script.sh # 绝对路径 ./script.sh # 相对路径
-
使用 source 或 . 执行
bash
source script.sh . script.sh
- 特点:在当前 Shell 进程中执行(不创建新进程)
- 重要:子脚本中的变量和函数可在当前 Shell 中使用
-
使用输入重定向或管道
bash
bash < script.sh cat script.sh | bash
3.3 Shell 脚本开发规范
3.3.1 基本规范
-
指定解释器:脚本首行必须指定解释器
-
添加版本信息:
bash
#!/bin/bash # Date:16:29 2022-3-30 # Author:Created by laoma # Description:This script is used to... # Version:2.0
-
避免中文:尽量使用英文注释和内容
-
文件扩展名:使用
.sh
作为脚本扩展名 -
固定存放路径:脚本存放在固定目录中
3.3.2 代码书写习惯
-
成对符号一次性写出:
{} [] '' `` ""
-
中括号保留空格:
[ condition ]
两端至少一个空格 -
先完成流程控制结构:
bash
# if 语句结构 if 条件内容;then 内容 fi # for 循环结构 for do 内容 done
-
代码缩进:通过缩进提高代码可读性
注意:尽量使用空格控制缩进,使用tab缩进可能导致意外错误。
-
变量引用规范:
- 字符串变量值加引号:
laoma_file="test.txt"
- 强引用用单引号:
welcome_string='******'
- 命令引用用反引号:
week_day="$(date +%A)"
- 字符串变量值加引号:
-
使用英文符号:所有符号都使用英文状态下的符号
缩进提高代码可读性
注意:尽量使用空格控制缩进,使用tab缩进可能导致意外错误。
-
变量引用规范:
- 字符串变量值加引号:
laoma_file="test.txt"
- 强引用用单引号:
welcome_string='******'
- 命令引用用反引号:
week_day="$(date +%A)"
- 字符串变量值加引号:
-
使用英文符号:所有符号都使用英文状态下的符号
提示:通过配置 ~/.vimrc
可以设置 vim 编辑时自动添加脚本头信息,提高开发效率。