Shell 语法基础学习(二)

在掌握了 Shell 脚本的基本命令、变量和脚本执行方式后,本文将进一步讲解条件判断、循环结构、函数等进阶语法,帮助你编写更复杂的脚本逻辑。


一、条件判断

1. if 语句

通过条件判断控制程序分支,语法格式:

if [ 条件 ]; then
    # 条件成立时执行的代码
else
    # 条件不成立时执行的代码
fi
示例:检查文件是否存在
if [ -f "data.txt" ]; then
    echo "文件存在"
else
    echo "文件未找到"
fi

2. 条件测试

文件测试
-f(是否为文件)、-d(是否为目录)、-e(是否存在)。
数值比较
-eq(等于)、-ne(不等于)、-gt(大于)。
字符串比较
=(相等)、!=(不相等)、-z(字符串为空)。

示例:比较两个数字
num1=10
num2=20
if [ $num1 -lt $num2 ]; then
    echo "$num1 小于 $num2"
fi

3. case 语句

多分支条件判断,适合匹配固定模式:

case $变量 in
    模式1)
        执行代码 ;;
    模式2)
        执行代码 ;;
    *)
        默认执行 ;;
esac
示例:根据输入执行操作
read -p "输入指令 (start/stop/restart): " cmd
case $cmd in
    start)
        echo "服务启动中..." ;;
    stop)
        echo "服务停止中..." ;;
    restart)
        echo "服务重启中..." ;;
    *)
        echo "无效指令" ;;
esac

二、循环结构

1. for 循环

遍历列表或范围执行操作:

for 变量 in 列表; do
    循环体
done
示例:批量处理文件
for file in *.txt; do
    echo "正在处理文件:$file"
    cp "$file" "backup_$file"
done

2. while 循环

条件为真时持续循环:

while [ 条件 ]; do
    循环体
done
示例:计数器递减
count=5
while [ $count -gt 0 ]; do
    echo "倒计时:$count"
    count=$((count-1))
done

3. until 循环

条件为假时持续循环(与 while 逻辑相反):

until [ 条件 ]; do
    循环体
done
示例:等待文件生成
until [ -f "report.log" ]; do
    echo "等待报告生成..."
    sleep 2
done
echo "报告已就绪!"

三、函数

1. 定义与调用

封装重复逻辑,提高代码复用性:

函数名() {
    函数体
    return 返回值  # 可选
}

# 调用函数
函数名 参数1 参数2
示例:计算两数之和
add() {
    sum=$(($1 + $2))
    echo "结果:$sum"
}

add 3 5  # 输出:结果:8

2. 参数传递

函数内通过 $1$2 接收参数,$# 获取参数个数:

check_user() {
    if [ "$1" = "admin" ]; then
        echo "管理员已登录"
    else
        echo "普通用户:$1"
    fi
}

check_user "Alice"  # 输出:普通用户:Alice

四、数组与字符串操作

1. 数组基础

• 定义数组:array=("A" "B" "C")
• 访问元素:${array[0]}(索引从 0 开始)
• 获取所有元素:${array[@]}

示例:遍历数组
fruits=("苹果" "香蕉" "橘子")
for fruit in "${fruits[@]}"; do
    echo "水果:$fruit"
done

2. 字符串处理

• 截取子串:${str:0:4}(从索引 0 截取 4 个字符)
• 替换内容:${str/old/new}(替换第一个匹配项)
• 获取长度:${#str}

示例:文件名后缀替换
filename="data_2023.log"
newfile="${filename/.log/.txt}"
echo "新文件名:$newfile"  # 输出:data_2023.txt

五、调试与错误处理

1. 调试模式

• 启用调试:set -x(显示每条命令及其参数)
• 关闭调试:set +x

2. 错误处理

• 立即退出:set -e(脚本遇到错误时终止)
• 捕获错误:trap '错误处理代码' ERR

示例:自动清理临时文件
trap "rm -f tmp.txt; echo '已清理临时文件'" EXIT
echo "Hello" > tmp.txt
cat tmp.txt

总结

本文涵盖了 Shell 脚本的条件判断、循环、函数等进阶语法,以及数组、字符串处理和调试技巧。建议结合以下场景练习:

  1. 编写一个备份脚本,仅复制最近修改的文件。
  2. 解析日志文件,统计错误出现的次数。

后续内容将探讨 进程管理信号处理脚本性能优化

调试脚本时,善用 set -xecho 输出中间变量值! 💡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值