当前位置: 首页 > news >正文

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 输出中间变量值! 💡

相关文章:

  • vue 获取当前时间并自动刷新
  • 解决 ECharts 切换图表时的 Resize 问题
  • STL---set常用函数
  • c语言笔记 结构体基础
  • QT QML实现音频波形图进度条,可点击定位或拖动进度
  • 单目3d detection算法记录
  • 24集《不负美食不负卿》联合出品制作签约仪式成功举行
  • 【运维自动化-标准运维】如何实现一个最简单的流程编排
  • 【Redis】Redis的数据删除(过期)策略,数据淘汰策略。
  • [Nowruz 1404] 2025 Crypto/PWN部分
  • 三月九次前端面试复盘:当场景题成为通关密钥
  • 使用 EchoAPI 实现 API 断言的全面指南
  • vulhub/Billu_b0x靶机----练习攻略
  • c盘清理宝藏小工具
  • 使用Trainer传入自定义的compute_metrics函数时,oom报错
  • Diffusion Transformers (DiTs) - 用Transformer革新Diffusion模型
  • 构建高可靠NFS存储:自动化挂载保障机制的设计与优势
  • 【Vuex:在带命名空间的模块内访问全局内容】
  • Docker运行postgreSQL,由于异常启动或者退出后,提示could not locate a valid checkpoint record
  • JS—事件委托:3分钟掌握事件委托
  • 伊朗外长称正与美国进行“善意”的会谈
  • 河北邯郸一酒店婚宴发生火灾:众人惊险逃生,酒店未买保险
  • 价格周报|供需回归僵局,本周生猪均价与上周基本持平
  • 花2万多在海底捞办婚礼,连锁餐企要抢酒楼的婚宴生意?
  • 烈士沈绍藩遗孤、革命家帅孟奇养女舒炜逝世,享年96岁
  • 比尔·盖茨:未来20年通过盖茨基金会捐出几乎全部财富,2045年底基金会停止运营