[转帖]shell编程之循环语句

shell,编程,循环,语句 · 浏览次数 : 0

小编点评

#排版内容 #第一排版 第一排版包含简单的排版,如标题、文字和图片。 #标题 #标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 #第二排版 第二排版包含简单的排版,如标题、文字和图片。 #标题 #标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 #第三排版 第三排版包含简单的排版,如标题、文字和图片。 #标题 #标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 #第四排版 第四排版包含简单的排版,如标题、文字和图片。 #标题 #标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 #第五排版 第五排版包含简单的排版,如标题、文字和图片。 #标题 #标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题 ##标题

正文


一、循环语句

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">&amp;&gt;</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">&amp;&gt;</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">&amp;&gt;</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

在这里插入图片描述

文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux入门初识Linux31425 人正在系统学习中

与[转帖]shell编程之循环语句相似的内容:

[转帖]shell编程之循环语句

目录 一、循环语句for循环for语句的结构嵌套循环 while语句的结构while语句应用示例 until语句的结构until语句示例 二、跳出循环continue跳出循环break跳出循环 三、常用循环脚本实例循环打印9*9乘法表数字累加脚本(1-100)常用转义字符购物shell 计算器正等腰

[转帖]Shell编程之免交互

目录 交互的概念与Linux中的运用Here Document 免交互tee命令重定向输出加标准输出支持变量替换多行注释Expect实例操作免交互预设值修改用户密码创建用户并设置密码实现 ssh 自动登录 交互的概念与Linux中的运用 交互:当计算机播放某多媒体程序的时候,编程人员可以发出指令控制

[转帖]Shell编程之函数

目录 Shell函数使用Shell函数的优点 Shell 函数定义使用原则函数传参函数变量的作用范围 函数递归阶乘递归目录函数库 Shell函数 将命令序列按格式写在一起可方便重复使用命令序列Shell函数定义 调用函数的方法 使用Shell函数的优点 使用函数可以避免代码重复使用函数可以将大的工程

[转帖]Shell编程之正则表达式与文本处理器(grep、sort、uniq、tr、cut)

目录 正则表达式概念正则表达式的作用元字符grep命令在文本中查找指定的字符串sort命令排序uniq命令快捷去重tr命令替换、压缩和删除cut命令快速裁剪命令expr substr 截取方法cut截取方法 split命令文件拆分paste命令文件合并eval变量扫描器位置锚定分组或其他扩展正则表达

[转帖]Bash脚本编程学习笔记10:参数展开

https://www.cnblogs.com/alongdidi/p/bash_parameter_expansion.html 简介 原标题叫做《Bash脚本编程之字符串处理》。 其实这里说得字符串处理,对应的是bash官网中的【Shell Parameter Expansion】,不过直接去看

[转帖]shell编程-字符截取命令

grep 命令 命令格式: grep [选项] 查找的字符串 文件名 作用: 在文件中搜索查找字符串,显示匹配字符串所在的行。 选项: -i:查找时忽略大小写。-n:显示行号。-v:反向查找(把不含有要搜索字符串的所有行显示出来)。-c:计算匹配到 ‘搜寻字符串’ 的次数。-r:在指定的目录中查找,

[转帖]Linux Shell编程 循环语法

https://zhuanlan.zhihu.com/ for循环 for 循环是固定循环,也就是在循环时已经知道需要进行几次循环。有时也把 for 循环称为计数循环。语法: for 变量 in 值1 值2 值3… do 程序 done 在这种语法中,for 循环的次数取决于 in 后面值的个数(以

[转帖]linux shell中 if else以及大于、小于、等于逻辑表达式介绍

https://www.jb51.net/article/34332.htm 在linux shell编程中,大多数情况下,可以使用测试命令来对条件进行测试,这里简单的介绍下,方便需要的朋友 比如比较字符串、判断文件是否存在及是否可读等,通常用"[]"来表示条件测试。注意:这里的空格很重要。要确保方

[转帖]整理收藏:shell中的test条件测试

https://zhuanlan.zhihu.com/p/504991399 shell编程中经常会有很多需要逻辑判断的地方,比如一个文件/文件夹是否存在,字符串是否为空等等,而test就具有这样的优良传统,将我们需要的结果通过简单的表达式查询,从而通过状态码$?取值。 1.对文件类型的检测 -e:

[转帖]shell脚本使用expect自动化交互登录远程主机进行批量关机

前文 1.目标主机登录用户都为root,且密码一致 2.目标主机开放启动了SSH服务且22号端口可访问(防火墙未进行拦截) 软件介绍 expect Expect是一个用来实现自动和交互式任务进行通信的免费编程工具语言。由Don Libes在1990年开始编写。 结合Shell Script实现自动和