Linux操作系统实验七 Shell编程之循环程序编程(上)

简介: Linux操作系统实验七 Shell编程之循环程序编程

1.实验目的与要求

  1. 掌握for语句的使用
  2. 掌握while、continue、until语句的使用
  3. 掌握循环语句的使用
  4. 熟悉循环语句的嵌套

2.实验平台

实验室安装的实验环境(Linux操作系统)和头歌(www.educoder.net)实验平台(课程实验)

3.实验内容

  1. 练习for语句的使用
  2. 练习while、continue、until语句的使用
  3. 练习循环语句的嵌套

4.实验详细内容、步骤

任务描述

本关任务:掌握 for 循环语句以及 seq 命令在 for 循环中的使用。

相关知识

在实际编程中,需要重复一组命令直至达到某个特定条件,比如处理某个目录下的所有文件、系统上的所有用户或是某个文本文件中的所有行。因此诞生了 for 循环、while 循环、util 循环这样的语句。本关首先给大家介绍 for 循环语句的使用。

for循环基本语法:
  1. for var in item1 item2 ... itemN
  2. do
  3.    command1
  4.    command2
  5.    ...
  6.    commandN
  7. done

或者写成一行:

  1. for var in item1 item2 ... itemN; do command1; command2… done;
for循环语法演变:

【语法一】遍历普通列表, 在 shell 中以空格隔开的 item ,默认将其视为列表。

  1. for 变量 in 值1 值2 值3..
  2.  do
  3.   程序块儿
  4.  done

【实例1】输出五次 uptime:

  1. #!/bin/bash

  2. for i in 1 2 3 4 5
  3. do
  4.  echo "$i-->$(uptime)"
  5. done

输出结果如下:

  1. [root@master-01-k8s opt]# bash a.sh
  2. 1--> 16:34:39 up 236 days, 23:41,  2 users,  load average: 0.53, 0.46, 0.49
  3. 2--> 16:34:39 up 236 days, 23:41,  2 users,  load average: 0.53, 0.46, 0.49
  4. 3--> 16:34:39 up 236 days, 23:41,  2 users,  load average: 0.53, 0.46, 0.49
  5. 4--> 16:34:39 up 236 days, 23:41,  2 users,  load average: 0.53, 0.46, 0.49
  6. 5--> 16:34:39 up 236 days, 23:41,  2 users,  load average: 0.53, 0.46, 0.49

【语法二】for 遍历 "命令返回结果的数组",反引号 ` ` 或者 $() 表示命令返回结果列表。

  1. for 变量 in `命令`
  2.  do
  3.   程序块儿
  4.  done

【实例2】遍历 /home 目录下的文件。

  1. #!/bin/bash
  2. for i in $(ls /home)      
  3. do
  4.   echo "当前目录下的文件为 $i"
  5. done

输出结果为:

  1. 当前目录下的文件为 admin
  2. 当前目录下的文件为 aliyun
  3. 当前目录下的文件为 aliyun_metric-server2.yaml
  4. 当前目录下的文件为 git
  5. 当前目录下的文件为 pdl
  6. 当前目录下的文件为 prometheus
  7. 当前目录下的文件为 work
  8. 当前目录下的文件为 zsp

【语法三】c 语言风格的循环语句:

  1. #!/bin/bash
  2. for (( 初始值; 循环控制; 变量变化 ))
  3. do
  4.  程序块儿
  5. done

shell 的 for 命令跟 C 语言类似,有一个用来指明变量的特定方法,一个必须保持成立才能继续迭代的条件,以及另一个在每个迭代中改变变量的方法。当指定的条件不成立时, for 循环就会停止。条件等式通过标准的数学符号定义。

【实例3】

  1. #!/bin/bash
  2. # 注意双括号左右留有一个空格; i=1是变量赋值,不能多空格
  3. for (( i=1; i <= 10; i++ ))

  4. do
  5.    echo "The next number is $i"
  6. done

这段代码产生了一个简单的迭代循环,其中变量 i 作为计数器。第一部分将一个默认值赋给该变量;中间的部分定义了循环重复的条件,当定义的条件不成立时, for 循环就停止迭代;最后一部分定义了迭代的过程。在每次迭代之后,最后一部分中定义的表达式会被执行。在本例中,i 变量会在每次迭代后增 1。 执行结果:

  1. The next number is 1
  2. The next number is 2
  3. The next number is 3
  4. The next number is 4
  5. The next number is 5
  6. The next number is 6
  7. The next number is 7
  8. The next number is 8
  9. The next number is 9
  10. The next number is 10
seq命令

seq 命令用于产生从某个数到另外一个数之间的所有整数列表。 常见用法如下:

  1. seq [选项]... 尾数
  2. seq [选项]... 首数 尾数
  3. seq [选项]... 首数 增量 尾数

【实列4】采用 seq 命令,结合 for 循环,打印 1 到 10 之间的所有整数。

  1. for i in `seq 1 10`
  2. do
  3.    echo "第$i个数是 $i"
  4. done

输出结果如下:

  1. 第1个数是 1
  2. 第2个数是 2
  3. 第3个数是 3
  4. 第4个数是 4
  5. 第5个数是 5
  6. 第6个数是 6
  7. 第7个数是 7
  8. 第8个数是 8
  9. 第9个数是 9
  10. 第10个数是 10

编程要求

在右侧编辑器 Begin-End 区间补充代码,使用 for 循环和 seq 命令打印 1 到 10 之间的奇数。

任务描述

本关任务:掌握 while 命令的使用方法。

相关知识

三种运算符号
  • 双小括号 (( )) 是 Bash Shell 中专门用来进行整数运算的命令,它的效率很高,写法灵活,是企业运维中常用的运算命令,具体用法请见图 1;
  • []是 Shell 内置关键字,它和 test 命令类似,可用于判断某个条件是否为真。可用于字符串、数值和文件的测试;
  • [[ ]]是 Shell 内置关键字,它和 test 命令类似,也用来检测某个条件是否成立。相比[][[]]功能更强大,支持正则表达式和逻辑运算。
while循环语法

while 循环是 Shell 脚本中最简单的一种循环,当条件满足时,while 重复地执行一组语句;当条件不满足时,就退出 while 循环。

while 循环的用法如下:

  1. while condition   # 此处 condition 可以是(())、[]、[[]]判断结果
  2. do
  3.    statements
  4. done

语法说明: condition 表示判断条件,statements 表示要执行的语句(可以只有一条,也可以有多条),do 和 done 都是 Shell 中的关键字。

while 循环的执行流程为:

  • 先对 condition 进行判断,如果该条件成立,就进入循环,执行 while 循环体中的语句,也就是 do 和 done 之间的语句。这样就完成了一次循环;
  • 每一次执行到 done 的时候,都会重新判断 condition 是否成立。如果成立,就进入下一次循环,继续执行 do 和 done 之间的语句;如果不成立,就结束整个 while 循环,执行 done 后面的其它 Shell 代码;
  • 如果一开始 condition 就不成立,那么程序就不会进入循环体,do 和 done 之间的语句就没有执行的机会。

注意:在 while 循环体中必须有相应的语句使得 condition 越来越趋近于“不成立”,只有这样才能最终退出循环,否则 while 就成了死循环,会一直执行下去,永无休止。

【实例1】每两秒钟向 /opt/uptime.log 文件中追加系统负载情况。

  1. #!/bin/bash
  2. while [ 1 ]   # [ 1 ]和 true 一样,只是前面2边需要有空格
  3. do
  4.        uptime >>/tmp/uptime.log  # >>是重定向符号
  5.        sleep 2
  6. done

  7. #注:
  8. #uptime 用于查看系统负载
  9. #sleep 2 表示程序睡眠一秒

【实例2】计算 1+2...100 的和。

  1. 方式一:
  2. #!/bin/sh
  3. SUM=0
  4. I=1
  5. while [ $I -le 100 ]  #[]中需要变量取值符号"$",而且大于小于只能用"-le"
  6. do
  7.        ((SUM+=I))
  8.        let I++
  9. done
  10. echo $SUM
  11. -------------------------------------------------------------------------------------------------
  12. 方式二:
  13. #!/bin/sh
  14. SUM=0
  15. I=1
  16. while ((I<=100)) #(())中可以不要变量取值符号,大于小于是可以直接用
  17. do
  18.        ((SUM+=I))
  19.        ((I++))
  20. done
  21. echo $SUM
  22. -------------------------------------------------------------------------------------------------
  23. 方式三:
  24. #!/bin/sh
  25. SUM=0
  26. I=100
  27. ((SUM=I*(I+1)/2))
  28. echo $SUM
循环中断和不中断

有些程序执行时,用户希望程序一直运行。在运行【实列1】中脚本时候,我们可以使用 sh shell.sh & 来代替 sh shell.sh 让其一直在后台执行。当我们遇到脚本死循环的时候,也可以使用 Ctrl+z 的方式强制中断。 常用的中断和不中断技巧如下:

  1. 使用"sh shell.sh &"命令 ,即使用 & 在后台运行
  2. 使用"nohup shell.sh &"命令,即使用 nohup 加 & 在后台运行脚本
  3. 利用 screen 保持会话,然后再执行脚本,即使用 screen 保持当前会话

  4. 后台运行的知识:
  5. sh shell.sh &        脚本 shell.sh 放在后台执行
  6. Ctrl+c           停止执行当前脚本或任务
  7. Ctrl+z           暂停执行当前脚本
  8. jobs             查看当前执行的脚本或任务

  9. bg           将当前脚本或任务放到后台执行
  10. kill             关闭当前脚本任务,即以"kill %号码"的形式关闭进程,任务号通过 jobs 获得
  11. fg           将当前的脚本或任务放到前台执行,若有多任务,则"fg 号码"调出相应的任务编号

【实例3】实际操作效果如下:

  1. [centos@mycentos shell]$ sh 2.sh &  #后台运行
  2. [1] 2988
  3. [centos@mycentos shell]$ jobs       #查看任务数
  4. [1]+  Running                 sh 2.sh &
  5. [centos@mycentos shell]$ kill %1    #关闭进程为1的进程
  6. [centos@mycentos shell]$ jobs      
  7. [1]+  Terminated              sh 2.sh #程序已经被关闭

大家可以根据实例 3 在命令行中自己试验一下。

目录
相关文章
|
18小时前
|
存储 运维 Java
Linux笔记02 —— Shell补充
Linux笔记02 —— Shell补充
17 2
|
18小时前
|
安全 Linux Shell
Linux笔记01 —— Linux初识与Shell汇总(请配合另一篇《Linux笔记02》一起使用)
Linux笔记01 —— Linux初识与Shell汇总(请配合另一篇《Linux笔记02》一起使用)
8 1
|
12天前
|
监控 网络协议 数据可视化
Shell脚本查看linux系统性能瓶颈
Shell脚本查看linux系统性能瓶颈
|
21天前
|
Shell Linux 网络安全
[01 Linux&Shell ] 清华大学电子系科协软件部2023暑期培训
[01 Linux&Shell ] 清华大学电子系科协软件部2023暑期培训
47 0
|
24天前
|
Linux Shell 开发工具
Shell的运行原理以及Linux当中的权限问题
Shell的运行原理以及Linux当中的权限问题
35 0
|
26天前
|
存储 Shell Linux
【攻防世界】unseping (反序列化与Linux bash shell)
【攻防世界】unseping (反序列化与Linux bash shell)
|
27天前
|
Shell Linux
在linux shell脚本中root切换到普通用户执行脚本或命令的方法
在linux shell脚本中root切换到普通用户执行脚本或命令的方法
13 1
|
27天前
|
Linux
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
Linux操作系统调优相关工具(三)查看IO运行状态相关工具 查看哪个磁盘或分区最繁忙?
24 0
|
27天前
|
监控 Unix Linux
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
Linux操作系统调优相关工具(四)查看Network运行状态 和系统整体运行状态
34 0
|
27天前
|
监控 数据可视化 Unix
自用的Linux命令高效的4个shell替代工具
这篇文章介绍了几个用于提升Unix系统终端体验的替代工具。首先提到了`oh-my-zsh`,然后重点推荐了三个命令行工具:1) `htop`和`btop`作为`top`命令的增强版,提供更丰富的进程监控视图;2) `duf`作为`df`命令的替代,以更整洁的界面显示磁盘空间使用情况;3) `eza`(原`exa`)和`bat`,这两个工具为`ls`和`cat`命令提供了颜色高亮和更好的文件查看体验。这些工具旨在使终端操作更加直观和愉快。
19 0