主题
Shell脚本基础语法
课程介绍
Shell脚本是Linux系统自动化运维的核心工具,通过编写脚本可以将复杂的命令序列封装成可重复执行的程序。本课程将带你从零开始学习Shell脚本的基础语法,包括脚本的创建、执行、注释、变量等核心概念,为后续学习Shell编程打下坚实基础。
1. Shell脚本概述
1.1 什么是Shell脚本
- 定义:Shell脚本是一种用Shell命令编写的脚本程序,用于自动化执行系统管理任务
- 特点:
- 解释型语言,无需编译
- 直接调用系统命令
- 支持变量、条件判断、循环等编程特性
- 跨平台兼容性好
1.2 常见的Shell类型
| Shell类型 | 特点 | 应用场景 |
|---|---|---|
| bash | 最常用,兼容性好 | Linux系统默认Shell |
| sh | 最基础的标准Shell | Unix系统通用Shell |
| zsh | 功能强大,配置灵活 | macOS和部分Linux发行版 |
| csh/tcsh | 类C语言语法 | 历史遗留系统 |
1.3 查看当前Shell
bash
# 查看当前使用的Shell
echo $SHELL
# 查看系统可用的Shell列表
cat /etc/shells2. 第一个Shell脚本
2.1 创建脚本文件
使用文本编辑器创建脚本文件,推荐使用VIM或VS Code。
示例:创建第一个脚本
bash
# 创建脚本文件
vim hello.sh脚本内容:
bash
#!/bin/bash
# 这是一个简单的Shell脚本示例
echo "Hello, World!"
echo "Welcome to Shell scripting!"2.2 脚本结构解析
bash
#!/bin/bash # Shebang行,指定解释器路径
# 这是注释 # 以#开头的行为注释,不会被执行
echo "Hello, World!" # 执行命令,输出文本Shebang行说明:
- 必须位于脚本的第一行
- 以
#!开头,后面跟随解释器的绝对路径 - 告诉系统使用哪个程序来执行该脚本
2.3 执行脚本
Shell脚本有多种执行方式,每种方式的特点不同。
方式1:使用bash命令执行
bash
# 直接使用bash命令执行脚本
bash hello.sh
# 或使用sh命令执行
sh hello.sh方式2:添加执行权限后执行
bash
# 添加执行权限
chmod +x hello.sh
# 执行脚本
./hello.sh方式3:使用source或.命令执行
bash
# 使用source命令执行(在当前Shell中执行)
source hello.sh
# 或使用.命令执行(与source等价)
. hello.sh三种执行方式的区别:
| 执行方式 | 子Shell | 变量传递 | 权限要求 |
|---|---|---|---|
bash script.sh | 是 | 否 | 不需要 |
./script.sh | 是 | 否 | 需要+x权限 |
source script.sh | 否 | 是 | 不需要 |
3. Shell注释
3.1 单行注释
使用#符号添加单行注释。
bash
#!/bin/bash
# 这是一个单行注释
echo "Hello" # 这也是单行注释3.2 多行注释
Shell没有专门的多行注释语法,但可以使用以下技巧:
方法1:连续使用#
bash
#!/bin/bash
# 这是多行注释的第一行
# 这是多行注释的第二行
# 这是多行注释的第三行
echo "Hello"方法2:使用:命令
bash
#!/bin/bash
: '
这是多行注释的第一行
这是多行注释的第二行
这是多行注释的第三行
'
echo "Hello"方法3:使用Here Document
bash
#!/bin/bash
<<COMMENT
这是多行注释的第一行
这是多行注释的第二行
这是多行注释的第三行
COMMENT
echo "Hello"4. Shell变量
4.1 变量定义
Shell变量定义不需要指定类型,直接赋值即可。
基本语法:
bash
变量名=值注意事项:
- 变量名和等号之间不能有空格
- 变量名只能包含字母、数字和下划线
- 变量名不能以数字开头
- 变量名区分大小写
示例:
bash
#!/bin/bash
# 定义变量
name="张三"
age=25
city="北京"
# 使用变量
echo "姓名:$name"
echo "年龄:$age"
echo "城市:$city"4.2 变量引用
使用$变量名或${变量名}引用变量。
示例:
bash
#!/bin/bash
filename="test.txt"
# 使用$变量名
echo $filename
# 使用${变量名}(推荐,更清晰)
echo ${filename}
# 区分变量名和后续字符
echo "${filename}.bak"4.3 变量类型
字符串变量
bash
#!/bin/bash
# 单引号字符串(不解析变量)
str1='Hello $name' # 输出:Hello $name
# 双引号字符串(解析变量)
name="张三"
str2="Hello $name" # 输出:Hello 张三
# 字符串拼接
str3="Hello, ""World!" # 输出:Hello, World!
str4="Hello, "$name # 输出:Hello, 张三数字变量
bash
#!/bin/bash
# 整数
num1=100
num2=200
# 浮点数(需要使用bc命令)
num3=3.14只读变量
bash
#!/bin/bash
# 定义只读变量
readonly PI=3.14159
# 尝试修改只读变量(会报错)
PI=3.14 # 错误:readonly variable删除变量
bash
#!/bin/bash
# 定义变量
name="张三"
echo $name # 输出:张三
# 删除变量
unset name
echo $name # 输出:(空)4.4 特殊变量
Shell提供了一些特殊变量,用于获取脚本和命令的参数。
| 变量 | 说明 |
|---|---|
$0 | 脚本名称 |
$1~$9 | 第1~9个参数 |
$# | 参数个数 |
$@ | 所有参数(每个参数独立引用) |
$* | 所有参数(作为整体引用) |
$? | 上一个命令的退出状态 |
$$ | 当前Shell进程ID |
$! | 后台运行的最后一个进程ID |
示例:
bash
#!/bin/bash
# 获取脚本名称
echo "脚本名称:$0"
# 获取参数
echo "第一个参数:$1"
echo "第二个参数:$2"
# 获取参数个数
echo "参数个数:$#"
# 获取所有参数
echo "所有参数:$@"
echo "所有参数:$*"
# 获取上一个命令的退出状态
ls /root
echo "上一个命令的退出状态:$?"
# 获取当前进程ID
echo "当前进程ID:$$"5. 输入输出
5.1 标准输出
使用echo命令输出文本。
基本用法:
bash
#!/bin/bash
# 输出文本
echo "Hello, World!"
# 输出变量
name="张三"
echo "姓名:$name"
# 输出空行
echo ""
# 输出转义字符
echo -e "第一行\n第二行\n第三行"echo选项:
| 选项 | 说明 |
|---|---|
-n | 不输出换行符 |
-e | 启用转义字符解释 |
-E | 禁用转义字符解释(默认) |
常用转义字符:
| 转义字符 | 说明 |
|---|---|
\n | 换行 |
\t | 制表符 |
\\ | 反斜杠 |
\" | 双引号 |
\$ | 美元符号 |
5.2 标准输入
使用read命令从标准输入读取数据。
基本用法:
bash
#!/bin/bash
# 读取用户输入
echo "请输入你的姓名:"
read name
echo "你好,$name!"
# 一行读取多个变量
echo "请输入姓名和年龄(用空格分隔):"
read name age
echo "姓名:$name,年龄:$age"
# 使用-p参数直接提示
read -p "请输入你的城市:" city
echo "城市:$city"
# 使用-t参数设置超时(秒)
read -t 5 -p "请在5秒内输入你的职业:" job
echo "职业:$job"
# 使用-s参数隐藏输入(适用于密码)
read -s -p "请输入密码:" password
echo ""
echo "密码已输入"read选项:
| 选项 | 说明 |
|---|---|
-p | 直接显示提示信息 |
-t | 设置超时时间(秒) |
-s | 隐藏输入内容 |
-n | 限制输入字符数 |
6. 完整示例
示例1:用户信息收集脚本
bash
#!/bin/bash
# 用户信息收集脚本
echo "===== 用户信息收集 ====="
# 读取用户信息
read -p "请输入你的姓名:" name
read -p "请输入你的年龄:" age
read -p "请输入你的城市:" city
read -p "请输入你的职业:" job
# 输出用户信息
echo ""
echo "===== 用户信息 ====="
echo "姓名:$name"
echo "年龄:$age"
echo "城市:$city"
echo "职业:$job"
echo "=================="示例2:系统信息显示脚本
bash
#!/bin/bash
# 系统信息显示脚本
echo "===== 系统信息 ====="
echo "主机名:$(hostname)"
echo "操作系统:$(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2)"
echo "内核版本:$(uname -r)"
echo "CPU架构:$(uname -m)"
echo "当前用户:$(whoami)"
echo "当前目录:$(pwd)"
echo "=================="示例3:备份脚本基础框架
bash
#!/bin/bash
# 备份脚本基础框架
# 定义变量
SOURCE_DIR="/home/user/data"
BACKUP_DIR="/home/user/backup"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="backup_${DATE}.tar.gz"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行备份
echo "开始备份..."
tar -czf ${BACKUP_DIR}/${BACKUP_FILE} ${SOURCE_DIR}
# 检查备份是否成功
if [ $? -eq 0 ]; then
echo "备份成功!"
echo "备份文件:${BACKUP_DIR}/${BACKUP_FILE}"
else
echo "备份失败!"
exit 1
fi7. 脚本调试技巧
7.1 语法检查
使用bash -n检查脚本语法错误。
bash
# 检查脚本语法
bash -n script.sh7.2 调试模式
使用bash -x执行脚本,显示每条命令及其执行结果。
bash
# 调试模式执行脚本
bash -x script.sh7.3 在脚本中启用调试
在脚本中添加set -x启用调试,set +x关闭调试。
bash
#!/bin/bash
set -x # 启用调试
echo "Hello"
name="张三"
echo "姓名:$name"
set +x # 关闭调试
echo "调试已关闭"课程总结
这节课我们学习了Shell脚本的基础语法。
核心内容:
- Shell脚本概述和常见类型
- 脚本的创建和执行方式
- 注释的使用方法
- 变量的定义和引用
- 输入输出操作
- 特殊变量的使用
重要命令:
echo:输出文本read:读取输入bash -n:语法检查bash -x:调试执行
Shell脚本是Linux自动化运维的基础,掌握这些基础知识后,我们将在后续课程中学习条件判断、循环、函数等高级特性。
课后练习
练习1(基础)
创建一个Shell脚本,要求:
- 输出"Hello, Shell Scripting!"
- 定义一个变量
name,值为你的名字 - 输出"欢迎,$name!"
练习2(进阶)
创建一个交互式脚本,要求:
- 提示用户输入姓名、年龄、城市
- 输出用户信息,格式如下:
===== 用户信息 ===== 姓名:xxx 年龄:xxx 城市:xxx ==================
练习3(拓展)
创建一个脚本,要求:
- 接收脚本参数(至少2个参数)
- 输出脚本名称
- 输出参数个数
- 输出所有参数
- 输出当前进程ID