bash shell笔记——循环结构

server/2025/2/12 14:54:24/
0 引言

本文主要介绍linux bash shell循环结构的基本使用

1 测试环境

查看系统版本:
uname -a : Ubuntu 18.04

查看bash版本:
bash -version : GNU bash, version 4.4.20(1)-release

创建.sh文件:
vim 00test.sh

修改00test.sh权限:
chmod 777 00test.sh 或 chmod +x 00test.sh

修改文件内容并保存:

bash">#!/bin/bash
echo "Hello World!"

执行.sh文件:
./00test.sh

完成上述操作后会在终端中打印“Hello World!”,到此,一个简单的shell脚本就完成了,本文后续内容将不再重复上述步骤

2 for循环
bash">#!/bin/bash 
# 用 /bin/bash 这个可执行文件来解释并运行这个脚本# shell使用“#”进行单行注释# ----------------------------------------------------------
# 1 C 语言风格的 for 命令(单个变量)
for (( i=0; i<10; i++ ))
do# 使用“echo”命令来打印文本,类似于C中的“printf”# 若打印的是变量,需要在变量名前加“$”,类似于C语言的“%d”echo "num : $i"
done# ----------------------------------------------------------
# 2 C 语言风格的 for 命令(多个变量)
for (( i=0, j=9; i<10; i++, j-- ))
doecho "num_i : $i  num_j : $j"
done# ----------------------------------------------------------
# 3 读取列表中的值
for num in 1 2 3 4 5
doecho "num : $num"
done# ----------------------------------------------------------
# 4 读取列表中的复杂值
# 优雅的遍历 I'm from Xi'an and used to be in New York
# for循环假定每个值都是用空格分割的,
# 对于包含空格的数据值可用双引号括起来
# 如果要使用单引号,需要在单引号前加“\”或使用双引号括起来
for word in I\'m from "Xi'an" and used to be in "New York" 
doecho "word : $word"
done# ----------------------------------------------------------
# 5 从变量读取列表
# 定义变量list
list="1 2 3 4 5" 
# 向list中添加值,方法1:
list="$list 6 7 8"
# 向list中添加值,方法2:
list=$list" 9 10"
# 引用变量时需在变量名前加“$”
for num in $list
doecho "num : $num"
done# ----------------------------------------------------------
# 6.1 从命令读取值(cat)
# 在本脚本同级目录下创建01test.txt,并写入以下内容:
# apple banana orange
# dog cat 
# book
# 同级目录下直接将文件名赋值给变量filename
# 否则需要使用绝对路径
filename=01test.txt
# cat命令用于读取文件01test.txt内容,并返回一个字串列表
for word in `cat $filename`
doecho "word : $word"
done# ----------------------------------------------------------
# 6.2 从命令读取值(ls)
# ls命令用于列出当前目录下的文件和文件夹
# 除了 ls 、cat 命令外,还可以使用 find 和 grep 等命令
for file in `ls`
doecho "word : $file"
done# ----------------------------------------------------------
# 7.1 更改字段分隔符
# 测试6.1时会发现打印内容为6行,而不是3行,
# 其原因为默认情况下 bash shell 会将空格、制表符、换行符作为分隔符
# 分隔符是特殊的环境变量 IFS (内部字段分隔符,internal field separator)
# 若想分类打印6.1的内容,需要更改字段分隔符:将IFS的值更改为换行符
filename=01test.txt
# 更改字段分隔符为换行符
IFS=$'\n'
for word in `cat $filename`
doecho "word : $word"
done# ----------------------------------------------------------
# 7.2 更改字段分隔符并还原
# 示例7.1中,修改IFS值后,该脚本的其他地方将沿用该值,该操作存在问题
# 例如在同一脚本中可能处理多个文件,这些文件的分隔符可能不同
# 为避免上述问题发生,可在修改前先保存原IFS值,用完后再改回来
# 保存原IFS值
IFS_OLD=$IFS
filename=01test.txt
# 更改字段分隔符为换行符
IFS=$'\n'
for word in `cat $filename`
doecho "word : $word"
done
# 改回原IFS值
IFS=$IFS_OLD# 可指定多个IFS字符,示例如下
IFS=$'\n':;*
# 该赋值会将换行符、冒号、分号和星号作为字段分隔符
3 while循环
bash">#!/bin/bash# ----------------------------------------------------------
# 1 while 的基本格式
num=5
# -gt : great than 大于
while [ $num -gt 0 ] 
doecho "num : $num"num=$[$num-1]         # 法1:使用“$[]”进行数学运算# num=`expr $num - 1` # 法2:使用“expr”命令进行数学运算
done# ----------------------------------------------------------
# 2 使用多个测试命令
# while语句行可定义多个测试命令
# 每个测试命令都出现在单独的一行上
# 只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环
num=5
# -ge : great equal 大于等于
while echo $num [ $num -ge 0 ] 
do echo "num : $num" num=$[ $num - 1 ] 
done
4 until循环
bash">#!/bin/bash# ----------------------------------------------------------
# 1 使用多个测试命令
# until语句行可定义多个测试命令
# 每个测试命令都出现在单独的一行上
# 只有测试命令的退出状态码不为0才会执行循环中列出的命令
# 下述示例中,当num=5时,
# [ $num -eq 0 ]不成立,退出状态码不为0,执行循环中的命令
# 当num=0时,[ $num -eq 0 ]成立,退出状态码为0,退出循环
num=5
until echo $num [ $num -eq 0 ] 
do echo "num : $num" num=$[ $num - 1 ]
done
5 嵌套循环
bash">#!/bin/bash# ----------------------------------------------------------
# 1 示例1
for (( a = 1; a <= 3; a++ )) 
do echo "a : $a ----" for (( b = 1; b <= 3; b++ )) do echo "b : $b" done 
done# ----------------------------------------------------------
# 2 示例2
num1=3
while [ $num1 -ge 0 ] 
do echo "num1 : $num1 ---" for (( num2 = 1; $num2 <= 3; num2++ )) doecho "num2 : $num2" done num1=$[ $num1 - 1 ] 
done
6 循环控制
bash">#!/bin/bash# ----------------------------------------------------------
# 1 break 命令跳出单层循环
for i in 1 2 3 4 5
doecho "i : $i"if [ $i -eq 3 ]thenbreakfi
done# ----------------------------------------------------------
# 2 break n 命令跳出多层循环
# 若不指定n,则默认跳出1层循环
for (( i = 1; i <= 5; i++ )) # 第 3 层循环
doecho "i : $i ---"for (( j = 1; $j <= 5; j++ )) # 第 2 层循环doecho "j : $j --"for ((k = 1; $k <= 5; k++)) # 第 1 层循环doecho "k : $k"if [ $k -eq 2 ]thenbreak 2 # 跳出第 2 层循环fidonedone
done# ----------------------------------------------------------
# 3 continue 命令结束当前循环
for i in 1 2 3 4 5
doif [ $i -eq 3 ] # 若i=3,则结束当前循环(不再打印 i : 3)thencontinuefiecho "i : $i"
done# ----------------------------------------------------------
# 4 continue n 命令结束指定循环
# 若不指定n,则默认结束1层循环
for (( i = 1; i <= 5; i++ )) # 第 3 层循环
doecho "i : $i ---"for (( j = 1; $j <= 5; j++ )) # 第 2 层循环doecho "j : $j --"for ((k = 1; $k <= 5; k++)) # 第 1 层循环doecho "k : $k"if [ $k -eq 2 ]thencontinue 2 # 结束第 2 层循环fidonedone
done

【a】 本文部分内容参考自《Linux命令行与shell脚本编程大全 (第3版)》第13章


http://www.ppmy.cn/server/167088.html

相关文章

C语言————快速幂

在 C 语言中&#xff0c;快速幂是一种用于高效计算幂运算&#xff08;即 &#xff0c;其中 a是底数base&#xff0c;n 是指数power&#xff09;的算法。常规的幂运算方法是通过循环将底数a连乘n次&#xff0c;时间复杂度为O(n)。而快速幂算法利用了指数的二进制特性&#xff0c…

MAAS | Ollama 搭建本地 AI 大模型 deepseekWeb 界面调用

目录 一、环境准备二、安装 Ollama三、下载并部署 DeepSeek 模型四、简单交互五、通过 Web 界面调用大模型 在当今人工智能快速发展的时代&#xff0c;本地部署大语言模型赋予了用户更高的灵活性和个性化服务体验。本文介绍了如何准备环境、安装Ollama框架、下载并部署DeepSeek…

科技的尽头:在有限与永恒的夹缝中寻找文明的真谛

当人类用燧石点燃第一簇文明之火时&#xff0c;科技发展的齿轮便已开始转动。这个从原始工具到量子计算机的进化历程&#xff0c;既是人类突破生物局限的史诗&#xff0c;也是文明不断自我解构与重构的哲学叙事。站在人工智能与基因编辑并行的时代节点&#xff0c;"科技尽…

【数据库设计】深入理解常见范式

第一范式&#xff08;1NF&#xff09;&#xff1a;数据原子性奠基者 核心要求&#xff1a;字段不可再分&#xff0c;消除重复数据组 设计哲学&#xff1a;建立数据存储的基本单元标准实现要点&#xff1a; 每个字段存储单一类型数据消除横向重复&#xff08;多值字段&#xf…

1.1 画质算法的主要任务

文章目录 画质算法及分类画质问题的核心&#xff1a;退化 画质算法及分类 图像画质算法是指&#xff0c;处理图像或视频数字信号&#xff0c;以提高其视觉质量、人眼感官的算法。图像画质算法可分为&#xff1a;去噪&#xff08;Denoising), 超分辨率&#xff08;Super-Resolut…

Unity-Mirror网络框架-从入门到精通之MultipleMatches示例

文章目录 前言MultipleMatchesLobbyViewRoomViewMatchGUIPlayerGUI总结前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Unity的开源网络框架,专为多人…

openbmc web/redfish到底层设计(持续更新...)

1.说明 本节是厘清openbmc的界面层web或者redfish到底层数据获取与展示。 不可或缺的是先阅读官方关于redfish的设计文档: 1.https://github.com/openbmc/docs/blob/master/designs/redfish-authorization.md2.https://github.com/openbmc/docs/blob/master/designs/redfish…

后盾人JS -- 模块化开发

开发模块管理引擎 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </he…