[转帖]shell编程之循环语句
目录
一、循环语句
for循环
用于已知循环次数的场景。
通过读取不同的变量值,用来逐个执行同一组命令。
基本格式:
for 变量名称(注意是名称不是变量$等) [ in 名称范围 ] (可以不写)
do
执行内容 若满足循环则做什么动作
done for循环结束标志
for语句的结构

- 示例1
批量添加用户。用户名存放在users.txt文件中,每行一个,初始密码均设为123456,最后验证脚本。
vim users.txt #输入要创建的用户名
#/bin/bash
for i in $( cat users.txt )
do
useradd $i
echo 123456 | passwd --stdin $i
done
- 1
- 2
- 3
- 4
- 5
- 6

- 示例2
根据IP地址检查主机状态。IP地址存放在ipadds.txt文件中,每行一个,使用ping命令检测各主机的连通性。
#/bin/bash
for i in {10..20}
do
ping -c 3 -i 0.5 -w 3 192.168.154.$i &> /dev/null
if [[ $? -eq 0 ]]
then
echo "192.168.154.$i online"
else
echo "192.168.154.$i offline"
fi
done
~
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12

嵌套循环
#/bin/bash
for i in {1..3}
do
for j in {1..5}
do
if [ $j -eq 3 ]
then
break
fi
echo $j
done
done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13

while语句的结构
重复测试某个条件,只要条件成立则反复执行

while语句应用示例
- 示例1
批量添加用户。用户名称以stu开头,按数字顺序进行编号,一共添加20个用户,即stu1、stu2、…、stu20,初始密码均设为123456。
#/bin/bash
i=1
while [ $i -le 20 ]
do
useradd stu${i}
echo 123456 | passwd --stdin stu${i}
let i++
done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8

- 示例2
猜商品价格游戏。通过变量RANDOM获得随机数,提示用户猜测并记录次数,猜中后退出循环。
#/bin/bash
num=`echo $[ RANDOM%100+1 ]`
time=0
while true
do
read -p "请用户猜一个数字(1-100):" a
let time++
if [ $a -eq $num ]
then
echo "恭喜你猜对了,$num"
echo "你一共猜了${time}次"
break
elif [ $a -lt $num ]
then
echo "你猜小了,往大了猜"
elif [ $a -gt $num ]
then
echo "你猜大了,往小了猜"
fi
done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20

until语句的结构
重复测试某个条件,只要条件不成立就反复执行

until语句示例
- 示例1
计算1-50的和值。通过循环累加的方式计算1-50的和值
i=1
sum=0
until [ $i -gt 50 ]
do
sum=$(($sum+$i))
let i++
done
echo "1-50的累加和为:$sum"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8

二、跳出循环
continue跳出循环
表示满足continue条件时跳出循环,但是不影响后续循环执行


break跳出循环
break跳出循环
在某个循环中遇到break直接结束此次循环,但是不影响外边嵌套的循环。
break [数字] 结束数字中的几次循环,若为2则结束自己所在循环和外边嵌套的一层循环,若为3则结束自己所在循环和外边嵌套的2层循环


具体来说,这段脚本的执行过程如下:
外部循环 for j in {1…3} 循环执行三次,j 分别等于 1、2、3。
在每次外部循环开始时,内部循环 for i in {1…5} 循环执行五次,i 分别等于 1、2、3、4、5。
在内部循环中,当 i 等于 3 时,执行 break 跳出循环。
在内部循环中,使用 echo “$i” 打印当前的数字序列。
在内部循环执行完毕后,外部循环继续执行,直到执行完三次为止。
三、常用循环脚本实例
循环打印9*9乘法表
思路:
①第一步for循环打印一行9个*号
②第二步再添加一个for循环打印一个9行9列的*号正方形
②第三步将号正方形斜砍一般形成99乘法表的基本格式
③第四步将号99乘法表格式用乘法算式替换
for ((i=1;i<=9;i++))
do
for ((j=1;j<=i;j++))
do
echo -ne "${i}*${j}=$[$i*$j]\t"
done
echo ""
done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9

数字累加脚本(1-100)
需求:编写脚本实现计算从1加到100的值
思路:
①累加需要用到循环,已知循环次数时使用for循环
②也可以使用while循环达到累加条件时结束循环
sum=0 #定义变量sum初始值为0
for i in {1..100} #for循环 i取值从1到100
do
sum=$[ i+sum ]
#let sum=$i+$sum #每次循环内容计算变量i+sum的值赋值给sum,二选一
done #for语句结束标志
echo "1-100累加值为:$sum" #循环结束后输出内容
- 1
- 2
- 3
- 4
- 5
- 6
- 7

常用转义字符
echo -n 表示不换行输出
echo -e 输出转义字符,将转义后的内容输出到屏幕上
常用的转义字符如下:
\b 转义后相当于按退格键(backspace),但前提是" \b “后面存在字符;” \b “表示删除前一个字符,” \b\b "表示删除前两个字符。
\c 不换行输出,在"\c"后面不存在字符的情况下,作用相当于 echo -n; 但是当"\c"后面仍然存在字符时,"\c"后面的字符将不会被输出。
\n 换行,被输出的字符从"\n"处开始另起一行。
\f 换行,但是换行后的新行的开头位置连接着上一行的行尾;
\v 与\f相同;
\t 转以后表示插入tab,即横向制表符;
\r 光标移至行首,但不换行,相当于使用"\r"以后的字符覆盖"\r"之前同等长度的字符;但是当"\r"后面不存在任何字符时,"\r"前面的字符不会被覆盖
\ 表示插入" \ "本身;
购物
逛淘宝选购商品,每家商店有五种商品选购(衣服500元,裤子400元,鞋子350元,帽子150元,袜子50元),每次选购完或不买都会提示用户是否继续逛下一家商店,如果不再继续逛的话进行购物车结算总额。
#!/bin/bash
i=1
sum=0 while [ \(i</span> -le <span class="token number">5</span> <span class="token punctuation">]</span>
<span class="token keyword">do</span>
<span class="token builtin class-name">echo</span> <span class="token string">"进入第<span class="token variable">\)i家商店"
read -p "是否进入看看(yes/no)" doing
while [ \(doing</span> <span class="token operator">=</span> <span class="token string">"yes"</span> <span class="token punctuation">]</span>
<span class="token keyword">do</span>
<span class="token builtin class-name">echo</span> <span class="token string">"1:衣服 ¥200"</span>
<span class="token builtin class-name">echo</span> <span class="token string">"2:鞋子 ¥180"</span>
<span class="token builtin class-name">echo</span> <span class="token string">"3:帽子 ¥50"</span>
<span class="token builtin class-name">echo</span> <span class="token string">"4:裤子 ¥190"</span>
<span class="token builtin class-name">read</span> -p <span class="token string">"请选择需要购买的商品序列号:"</span> num
<span class="token keyword">case</span> <span class="token variable">\)num in
1)
echo "衣服购买成功"
expr $[sum+=200] &>/dev/null
;;<span class="token number">2</span><span class="token punctuation">)</span>
<span class="token builtin class-name">echo</span> <span class="token string">"鞋子购买成功"</span>
<span class="token function">expr</span> $<span class="token punctuation">[</span>sum<span class="token operator">+=</span><span class="token number">180</span><span class="token punctuation">]</span> <span class="token operator">&></span>/dev/null
<span class="token punctuation">;</span><span class="token punctuation">;</span> <span class="token number">3</span><span class="token punctuation">)</span>
<span class="token builtin class-name">echo</span> <span class="token string">"帽子购买成功"</span>
<span class="token function">expr</span> $<span class="token punctuation">[</span>sum<span class="token operator">+=</span><span class="token number">50</span><span class="token punctuation">]</span> <span class="token operator">&></span>/dev/null
<span class="token punctuation">;</span><span class="token punctuation">;</span> *<span class="token punctuation">)</span>
<span class="token builtin class-name">echo</span> <span class="token string">"裤子购买成功"</span>
<span class="token function">expr</span> $<span class="token punctuation">[</span>sum<span class="token operator">+=</span><span class="token number">190</span><span class="token punctuation">]</span> <span class="token operator">&></span>/dev/null
<span class="token punctuation">;</span><span class="token punctuation">;</span>
<span class="token keyword">esac</span>
<span class="token builtin class-name">read</span> -p <span class="token string">"是否进行购买(yes/no)"</span> doing
done
let i++
if [ \(doing</span> <span class="token operator">=</span> <span class="token string">"no"</span> <span class="token punctuation">]</span>
<span class="token keyword">then</span> <span class="token builtin class-name">continue</span>
<span class="token keyword">fi</span>
<span class="token keyword">done</span>
<span class="token builtin class-name">echo</span> <span class="token string">"购物的总价为:<span class="token variable">\)sum"
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44

shell 计算器
#!/bin/bash
read -p "请输入第一个整数:" num1
read -p "请输入运算符:加(+);减(-);乘(x);除(/);趋于(%):" fh
read -p "请输入第二个整数:" num2
case $fh in
\+)
num=$(($num1+$num2))
echo "结果为:$num"
;;
\-)
num=$(($num1-$num2))
echo "输入结果为:$num"
;;
\*)
num=$(($num1*$num2))
echo "输入结果为:$num"
;;
\/)
num=$(($num1/$num2))
echo "输入结果为:$num"
;;
\%)
num=$(($num1%$num2))
echo "输入结果为:$num"
;;
*)
echo "输入不合法"
esac
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29


正等腰三角形
for ((i=1;i<=9;i++))
do
for ((j=9;j>=i;j--))
do
echo -n " "
done
for ((n=1;n<=i;n++))
do
echo -n "*"
done
for ((m=2;m<=i;m++))
do
echo -n "*"
done
echo ""
done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17

等腰梯形
for ((i=1;i<=10;i++))
do
for ((j=10;j>=i;j--))
do
echo -n " "
done
for ((n=1;n<=i;n++))
do
echo -n "*"
done
for ((t=1;t<=4;t++))
do
echo -n "*"
done
for ((m=1;m<=i;m++))
do
echo -n "*"
done
echo ""
done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22

圣诞树
for ((i=1;i<=10;i++))
do
for((j=1;j<=6;j++))
do
echo -n " "
done
for ((j=10;j>=i;j--))
do
echo -n " "
done
for ((n=2;n<=j;n++))
do
echo -n "*"
done
for ((m=4;m<=i;m++))
do
echo -n "*"
done
echo
done for ((i=1;i<=9;i++))
do
for ((m=1;m<=3;m++))
do
echo -n " "
done
for ((j=9;j>=i;j--))
do
echo -n " "
done
for ((n=1;n<=i;n++))
do
echo -n ""
done
for ((n=1;n<=4;n++))
do
echo -n ""
done
for ((n=2;n<=i;n++))
do
echo -n "*"
done echo
done for ((i=1;i<=9;i++))
do
for ((j=9;j>=i;j--))
do
echo -n " "
done
for ((n=1;n<=i;n++))
do
echo -n ""
done
for ((n=1;n<=10;n++))
do
echo -n ""
done
for ((n=2;n<=i;n++))
do
echo -n "*"
done
echo
done for ((i=1;i<=6;i++))
do
for ((j=1;j<=11;j++))
do
echo -n " "
done
for ((n=1;n<=7;n++))
do
echo -n "*"
done
echo ""
done
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83

[转帖]shell编程之循环语句的更多相关文章
- 04 shell编程之循环语句
Shell编程之循环语句 学习目标: 掌握for循环语句编程 掌握while循环语句编程 目录结构: For循环语句 l 读取不同的变量值,以逐个执行同一组命令 l For语句结构 for 变量名 ...
- shell编程之循环语句for / while / until
shell编程之循环语句与函数 一.条件测试 二.循环语句 ① for循环语句结构(遍历) 示例1 示例2 ② while循环语句结构(迭代) 示例1 示例2 ③ until 循环语句结构 示例1 一 ...
- Shell编程之循环语句与echo的用法
Shell编程之循环语句与echo的用法 目录 Shell编程之循环语句与echo的用法 一.echo用法 1. echo常用选项 2. 常用的转义字符 3. 特殊符号%.#的用法 二.循环语句 1. ...
- Linux - 简明Shell编程06 - 循环语句(Loop)
脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 #!/bin/bash # for循环 for fil ...
- shell编程之循环语句
for #! /bin/sh for FRUIT in apple banana pear; do echo "I like $FRUIT" done while #! /bin/ ...
- 02 shell编程之条件语句
Shell编程之条件语句 学习目标: 掌握shell脚本条件测试 掌握if语句编程 目录结构: 条件测试 条件测试概述 l 对特定的条件进行判断,以决定如何执行操作 l 测试的方法 方法1:tes ...
- if语句 条件测试 shell编程之条件语句
shell 编程之条件语句一.条件测试 ① test命令 测试 ② 文件测试 ③ 整数值比较 ④ 字符串比较 ⑤ 逻辑测试二.if语句的结构 单分支结构 双分支结构 多分支结构三.ca ...
- Shell编程之条件语句:if、case语句
Shell编程之条件语句:if.case语句 一.条件测试 1)test命令测试 2)整数值比较 ...
- shell脚本之循环语句与函数
shell脚本之循环语句与函数 echo的用法: echo -n #表示不换行输出 echo -e #输出转义字符,将转义后的内容输出到屏幕上 转义字符: \n :换行,被输出的字符从"\n ...
- bash 编程中循环语句用法
1.if 是单分支语句,使用格式如下: if condition ; then statement ….. fi 2.if … else 是双分支语句,使用格式如下: if condition ; t ...
随机推荐
- 2023河南省第五届“金盾信安杯”CRYPTO MISC 复现
MISC 来都来了 题目 我的解答: 给了一个加密压缩包,010查看发现是伪加密,修改如下两部分: 头部和尾部的09分别改为00 然后解压得到: 尝试base64解码得到很零散的结果..大眼一看不知道 ...
- k8s环境设置-pod下载及重启策略
k8s环境设置 在我们开始使用k8s之前,我们可以先做一些环境配置,使k8s更加的方便使用 第一个要做的就是kubectl命令的补全 在使用kubectl的时候你会发现参数你是Tab不出来的,这时候我 ...
- CSS 基础 2 - Box Model 盒模型
CSS 基础 2 - Box Model 盒模型 Box Model 盒模型是网页布局的前提.网页布局的几种方式: Table(过时):在 CSS 出现之前,一般用表格布局(将表格边框线隐藏) Flo ...
- GetView介绍 以及 GetxController生命周期
etView 只是对已注册的 Controller 有一个名为 controller 的getter的 const Stateless 的 Widget,如果我们只有单个控制器作为依赖项,那我们就可以 ...
- Cesium案例解析(八)——CesiumWidget简化窗体
目录 1. 正文 2. 参考 1. 正文 Cesium Widget这个案例展示了一个Cesium的简化窗体.在之前的案例中使用的都是Cesium.Viewer这个窗体组件,包含了非常丰富的组件内容. ...
- GaussDB技术解读系列之SQL Audit,面向应用开发的SQL审核工具
本文分享自华为云社区<GaussDB技术解读系列之SQL Audit,面向应用开发的SQL审核工具>,作者:华为云数据库和应用迁移专家. 前言 我们先从一个SQL语句说起(以某传统 ...
- 二进制SCA指纹提取黑科技:Go语言逆向技术
摘要:SCA(Software Composition Analysis)软件成分分析,指通过对软件源码.二进制软件包等的静态分析,挖掘其所存在的开源合规.已知漏洞等安全合规风险,是一种业界常见的安全 ...
- 宝藏昇腾AI应用推荐!CANN带你体验黑白图像自动上色的快乐~
摘要:属于"你"那边的麦田 天空 河水 骏马 树木--会是什么颜色呢? 黑白与色彩 似乎把时代分割了两半~ 我在这头看见了错乱繁华,琳琅满目,看见快速消长的色彩缤纷. 翻开一张黑白 ...
- Ambari2.7.3.0添加组件
Ambari 2.7.3.0安装新组件和之前版本略有不同,本文将简述安装新组件的简单过程. 前提是大家已经安装好Ambari 2.7.3.0 这时候由于有一些组件没有添加,就需要安装新的组件. 首先我 ...
- 负载均衡 —— SpringCloud Netflix Ribbon
Ribbon 简介 Ribbon 是 Netfix 客户端的负载均衡器,可对 HTTP 和 TCP 客户端的行为进行控制.为 Ribbon 配置服务提供者地址后,Ribbon 就可以基于某种负载均衡算 ...
