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 在命令行中自己试验一下。

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
2天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
35 13
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
66 1
|
2月前
|
Shell
Shell编程(下)
Shell编程(下)
110 1
|
2月前
|
Shell Linux Windows
Shell编程(上)
Shell编程(上)
47 1
|
2月前
|
Shell Linux 开发工具
|
2月前
|
监控 Unix Shell
shell脚本编程学习
【10月更文挑战第1天】shell脚本编程
82 12
|
3月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
网络协议 Shell Linux
【Linux】shell编程基础(超详细,入门看这一篇就够了)(下)
【Linux】shell编程基础(超详细,入门看这一篇就够了)(下)
109 0
|
7月前
|
存储 Shell C语言
shell脚本 编程 变量 基本入门(详解)
shell脚本 编程 变量 基本入门(详解)