Skip to content

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  # 实时进程监控

最佳实践

  1. 脚本头部:总是在脚本开头使用 #!/bin/bash
  2. 注释:为复杂操作添加注释
  3. 变量命名:使用有意义的变量名
  4. 错误处理:使用 set -e 使脚本在出错时终止
  5. 调试:使用 set -xbash -x script.sh 调试脚本
  6. 输入验证:始终检查用户输入
  7. 退出状态:使用合适的退出状态码(0 表示成功,非 0 表示失败)
bash
#!/bin/bash
# 设置安全选项
set -e  # 出错即退出
set -u  # 使用未定义变量时报错

# 出错时清理
cleanup() {
    # 执行清理工作
    echo "执行清理..."
}
trap cleanup EXIT

# 脚本主体
main() {
    echo "脚本正在执行..."
}

main "$@"

贡献者

The avatar of contributor named as wkwbk wkwbk

页面历史