循环结构
for循环
- 列表遍历
语法结构:
bash
for 循环变量 in 元素1 元素2 元素3...元素n
do
#循环体
done
举例:
bash
#!/bin/bash
# -e 能解析\n的作用
echo -e "\n======遍历字符串列表============"
for fruit in 苹果 香蕉 橙子 葡萄 芒果
do
echo "当前遍历的水果是:$fruit"
done
- 序列范围遍历格式
bash
# 方式一
for 循环变量 in {起始值..结束值}
do
循环体
done
# 方式二
for 循环变量 in $(seq 起始值 步长 结束值)
do
循环体
done
举例:
bash
#!/bin/bash
echo "======遍历1-5=========="
# for循环:使用 {起始..结束} 生成数字序列,依次赋值给变量num
for num in {1..5}
# do 标记循环体的开始
do
# 输出当前循环变量num的值,$num表示引用变量
echo "当前遍历的数字是:$num"
done
echo "倒序输出1-5"
for num in {5..1}
do
echo "当前数字:$num"
done
echo -e "\n===== 生成1-10奇数(步长2) ====="
for num in $(seq 1 2 10)
do
echo "当前奇数:$num"
done
- c语言风格
bash
for(( 初始表达式; 循环条件表达式; 更新表达式))
do
循环体
done
案例题
遍历字符串列表 北京 上海 广州 深圳 杭州,依次输出「当前城市:XXX」;
bash
#!/bin/bash
for f in 北京 上海 广州 深圳 杭州
do
echo "当前城市:$f"
done
遍历数字序列 10 到 1(倒序),依次输出格式为「当前倒序数字:XXX」(XXX 对应遍历的数字)
bash
#!/bin/bash
for number in {10..1}
do
echo "当前倒序数字是:$number"
done
计算 1 到 100 所有偶数的累加和,循环结束后输出「1 到 100 所有偶数的累加和:XXX」。
bash
#!/bin/bash
sum=0
for (( i=1; i<=100; i+2))
do
sum=$((sum+i))
done
echo "1 到 100 所有偶数的累加和:$sum"
在上面这题的基础上,每累加10 个偶数,输出一次当前累加结果(格式:「前 10 个偶数累加和:XXX」、「前 20 个偶数累加和:XXX」......);
bash
#!/bin/bash
sum=0
count=0 # 新增计数变量,统计累加的偶数个数
for (( i=2; i<=100; i+=2 ))
do
sum=$((sum + i))
count=$((count + 1)) # 每累加1个偶数,计数+1
# 判断是否累计了10个偶数,满足则输出当前结果
if [ $((count % 10)) -eq 0 ]
then
echo "前$count个偶数累加和:$sum"
fi
done
# 输出最终结果
echo "1到100所有偶数的累加和:$sum"
遍历当前目录下所有 .txt 格式文件,依次输出「正在处理文件:XXX」(XXX 为对应 .txt 文件名);若没有 .txt 文件,输出「当前目录下未找到任何 .txt 文件」。
bash
#!/bin/bash
# 捕获当前目录下的所有.txt文件,屏蔽无匹配的错误提示
txt_files=$(ls *.txt 2>/dev/null)
# 判断是否存在.txt文件
if [ -z "$txt_files" ]
then
echo "当前目录下未找到任何 .txt 文件"
else
# 遍历所有.txt文件并输出
for file in $txt_files
do
echo "正在处理文件:$file"
done
fi
遍历当前目录下所有 .txt 格式文件,输出「正在处理文件:XXX」;
为每个 .txt 文件创建备份,备份文件名格式:原文件名_bak_当前日期.txt(例:test.txt → test_bak_20260106.txt);
无 .txt 文件仍输出「当前目录下未找到任何 .txt 文件」。
bash
#!/bin/bash
# 捕获当前目录下的.txt文件,屏蔽无匹配错误
txt_files=$(ls *.txt 2>/dev/null)
# 获取当前日期(年月日格式)
current_date=$(date +%Y%m%d)
if [ -z "$txt_files" ]
then
echo "当前目录下未找到任何 .txt 文件"
else
for file in $txt_files
do
echo "正在处理文件:$file"
# 拼接备份文件名(去掉原文件.txt后缀,再拼接备份格式)
backup_file="${file%.txt}_bak_${current_date}.txt"
# 复制原文件创建备份
cp "$file" "$backup_file"
done
fi
while循环
bash
#!/bin/bash
# 1. 初始化循环变量(必须先定义,否则循环无法正常终止)
循环变量=初始值
# 2. while 循环核心:条件判断为"真",就重复执行循环体
while [ 循环条件表达式 ] # 注意:[ 前后必须有空格,表达式内部也需保留必要空格 ]
do
# 3. 循环体:需要重复执行的代码(累加、输出等)
# 4. 更新循环变量(必须写,否则会陷入无限死循环!)
循环变量=$((循环变量 + 变化值)) # 常用自增:i=$((i+1))
done
bash
#!/bin/bash
echo "计算1-10的累加和"
# 初始化变量:sum存储累加和,i 存储当前计数
sum=0
i=1
while [ $i -le 10]
do
sum=$((sum+i))
i=$((i+1))
done
echo "输入提出条件终止循环"
tips="请输入字符(输入'q'或者'Q'退出循环"
echo "$tips"
while read input && [ "$input" !="q" ] && ["$input" !="Q"]
do
echo "你输入的内容是:$input"
echo "$tips"
done
多分支结构的编程
if判断
bash
if [ 条件1 ] # 注意:[ 前后必须有空格
then
# 条件1为真时,执行的代码
elif [ 条件2 ] # 注意:是elif,不是else if(写错直接报错)
then
# 条件2为真时,执行的代码
elif [ 条件3 ]
then
# 条件3为真时,执行的代码
else
# 所有条件都为假时,执行的代码
fi # 必须以fi结尾(对应if,倒过来写)
while 循环 + 多分支
bash
#!/bin/bash
# 1. 初始化循环变量
i=初始值
sum=0(可选,按需定义)
# 2. while循环核心条件
while [ 循环总条件 ] # 如:i -le 100
do
# 3. 多分支条件判断(嵌入循环体内)
if [ 分支条件1 ] # 如:i%2 -eq 0 (偶数)
then
分支1操作(如:sum=$((sum + i)))
elif [ 分支条件2 ] # 如:i%10 -eq 0 (能被10整除)
then
分支2操作(如:echo "当前数字是10的倍数:$i")
else
分支3操作(如:echo "当前数字是奇数:$i")
fi
# 4. 更新循环变量(防死循环,必须写)
i=$((i + 1))
done

符合什么条件的数的个数或者和的计算
计算「符合条件的数的累加和」
适用场景:求 1 到 N 中,符合某条件(如能被 3 整除、偶数、大于 50)的数的总和。
bash
#!/bin/bash
# 1. 初始化变量:累加和=0,循环变量按需初始化
sum=0
# 2. 遍历数字范围(C语言风格for循环,更简洁)
for (( i=【起始值】; i<=【结束值】; i++ ))
do
# 3. 筛选符合条件的数(核心:多分支/单分支判断)
if [ 【条件表达式】 ] # 如:$((i%3)) -eq 0(能被3整除)
then
# 4. 符合条件,累加求和(算术运算必用$((...)))
sum=$((sum + i))
fi
done
统计「符合条件的数的个数」
适用场景:统计 1 到 N 中,符合某条件的数有多少个(如奇数的个数、能被 5 整除的个数)。
bash
#!/bin/bash
# 1. 初始化变量:个数统计=0,循环变量按需初始化
count=0
# 2. 遍历数字范围
for (( i=【起始值】; i<=【结束值】; i++ ))
do
# 3. 筛选符合条件的数
if [ 【条件表达式】 ]
then
# 4. 符合条件,个数+1(算术运算必用$((...)))
count=$((count + 1))
fi
done
编写一个函数,接收函数,输出结果
bash
#!/bin/bash
# 定义函数:function 函数名() { 函数体 }
function 函数名() {
# 1. 接收参数:用 $1、$2、$3... 表示第1、2、3个传入参数(必记!)
参数1=$1
参数2=$2
# 2. 函数核心逻辑(累加、统计、输出等,和之前的循环/判断一致)
核心操作代码
# 3. 输出结果(直接用 echo,或返回值后再输出)
echo "输出结果:xxx"
}
# 调用函数:函数名 + 传入参数(参数之间用空格分隔)
函数名 参数值1 参数值2
bash
#!/bin/bash
# 定义函数(接收2个参数,实现自定义逻辑,输出结果)
function calc_func() {
# 步骤1:接收外部传入的参数,赋值给语义化变量(可选,提升可读性)
param1=$1 # 第1个参数
param2=$2 # 第2个参数
# 步骤2:核心逻辑(可替换为累加、统计、文件处理等,和之前一致)
result=$((param1 + param2)) # 示例:两数相加
# 步骤3:输出结果(按题目格式修改,直接echo即可)
echo "参数1:$param1,参数2:$param2,运算结果:$result"
}
# 步骤4:调用函数,传入2个参数(参数值按需修改)
calc_func 10 20

case
bash
case 变量名 in
模式1)
命令序列1
;; # 表示该分支结束,必须加
模式2)
命令序列2
;;
模式3|模式4) # 多个模式匹配同一分支(用|分隔)
命令序列3
;;
*) # 通配符,匹配所有未命中的情况(类似else)
默认命令序列
;;
esac