Shell 脚本 | 学习笔记
更新: 4/20/2025 字数: 0 字 时长: 0 分钟
Shell 简介
Shell 是一个命令行解释器,它为用户提供了与操作系统交互的接口。
作为一种解释型脚本语言,Shell 可以在不编译的情况下直接执行。
在 Linux/Unix 系统中,Shell 是默认的用户界面。
常见的 Shell 类型:
- Bourne Shell (sh)
- Bourne Again Shell (bash) - 最常用
- C Shell (csh)
- Korn Shell (ksh)
- Z Shell (zsh)
Shell 脚本基础
创建和执行 Shell 脚本
创建一个 Shell 脚本文件(以 .sh
为扩展名):
bash
#!/bin/bash
# 这是一个简单的Shell脚本
echo "Hello, World!"
脚本执行方法:
bash
# 方法1:给予执行权限后执行
chmod +x hello.sh
./hello.sh
# 方法2:直接用解释器执行
bash hello.sh
Shell 变量
定义和使用变量:
bash
# 定义变量(等号两边不能有空格)
name="Shell脚本"
number=100
# 使用变量(使用$符号)
echo $name
echo ${name} # 推荐使用这种形式,能够明确变量边界
特殊变量:
$0
- 脚本名称$1
到$9
- 脚本的参数$#
- 参数个数$*
或$@
- 所有参数$$
- 当前 Shell 的进程 ID$?
- 上一个命令的退出状态
字符串操作
bash
str="Hello Shell"
# 字符串长度
echo ${#str}
# 字符串截取
echo ${str:0:5} # 获取前5个字符
# 字符串替换
echo ${str/Shell/World} # 替换第一个匹配
echo ${str//e/E} # 替换所有匹配
流程控制
条件判断
if-else 语句:
bash
if [ 条件 ]; then
命令
elif [ 条件 ]; then
命令
else
命令
fi
条件测试:
- 文件测试:
[ -f 文件 ]
、[ -d 目录 ]
、[ -e 文件或目录 ]
- 字符串测试:
[ -z 字符串 ]
(空)、[ -n 字符串 ]
(非空)、[ 字符串1 = 字符串2 ]
- 数值比较:
[ $a -eq $b ]
、[ $a -ne $b ]
、[ $a -gt $b ]
、[ $a -lt $b ]
- 逻辑运算:
[ 条件1 -a 条件2 ]
(与)、[ 条件1 -o 条件2 ]
(或)、[ ! 条件 ]
(非)
循环结构
for 循环:
bash
# 列表循环
for item in item1 item2 item3; do
echo $item
done
# C风格循环
for ((i=1; i<=10; i++)); do
echo $i
done
while 循环:
bash
count=1
while [ $count -le 5 ]; do
echo $count
count=$((count+1))
done
until 循环:
bash
count=1
until [ $count -gt 5 ]; do
echo $count
count=$((count+1))
done
case 语句
bash
case $变量 in
模式1)
命令1
;;
模式2)
命令2
;;
*)
默认命令
;;
esac
函数
定义和调用函数:
bash
# 函数定义
function greet() {
echo "Hello, $1!"
}
# 函数调用
greet "World"
函数参数:
- 函数内部使用
$1
,$2
等访问参数 $#
表示参数个数$*
和$@
表示所有参数
函数返回值:
bash
function add() {
local result=$(($1 + $2))
echo $result # 输出作为返回值
return 0 # 返回状态码
}
sum=$(add 5 3) # 捕获函数输出
echo $sum
输入输出
读取用户输入
bash
echo "请输入您的姓名:"
read name
echo "您好,$name!"
# 一次读取多个变量
read -p "请输入姓名和年龄:" name age
echo "姓名:$name,年龄:$age"
重定向
bash
# 输出重定向
echo "内容" > 文件名 # 覆盖文件
echo "内容" >> 文件名 # 追加到文件
# 输入重定向
sort < 文件名
# 错误重定向
命令 2> 错误文件
# 同时重定向标准输出和错误输出
命令 > 输出文件 2>&1
管道
bash
# 将一个命令的输出作为另一个命令的输入
命令1 | 命令2 | 命令3
常用命令和技巧
文本处理
bash
# grep - 文本搜索
grep "pattern" file.txt
grep -i "pattern" file.txt # 忽略大小写
grep -r "pattern" directory # 递归搜索目录
# sed - 流编辑器
sed 's/old/new/g' file.txt # 替换
sed -i 's/old/new/g' file.txt # 直接修改文件
# awk - 文本分析工具
awk '{print $1, $3}' file.txt # 打印第1列和第3列
awk -F: '{print $1}' /etc/passwd # 指定分隔符
文件操作
bash
# 查找文件
find /path -name "*.txt" -type f
find /path -size +10M -type f # 查找大于10M的文件
# 文件权限管理
chmod 755 file # 设置权限
chown user:group file # 更改所有者
# 压缩和解压
tar -czvf archive.tar.gz directory/ # 创建压缩文件
tar -xzvf archive.tar.gz # 解压文件
系统信息
bash
# 系统和用户信息
uname -a # 显示系统信息
whoami # 当前用户
id # 用户ID信息
# 进程管理
ps aux # 显示进程
kill PID # 结束进程
top # 实时进程监控
最佳实践
- 脚本头部:总是在脚本开头使用
#!/bin/bash
- 注释:为复杂操作添加注释
- 变量命名:使用有意义的变量名
- 错误处理:使用
set -e
使脚本在出错时终止 - 调试:使用
set -x
或bash -x script.sh
调试脚本 - 输入验证:始终检查用户输入
- 退出状态:使用合适的退出状态码(0 表示成功,非 0 表示失败)
bash
#!/bin/bash
# 设置安全选项
set -e # 出错即退出
set -u # 使用未定义变量时报错
# 出错时清理
cleanup() {
# 执行清理工作
echo "执行清理..."
}
trap cleanup EXIT
# 脚本主体
main() {
echo "脚本正在执行..."
}
main "$@"