Linux操作系统实验五 shell编程基础(三)

简介: Linux操作系统实验五 shell编程基础(三)

 【实例3】在指定时间内输入密码。

  1. #!/bin/bash
  2. if
  3.    read -t 20 -sp "Enter password in 20 seconds(once) > " pass1 && printf "\n" &&  #第一次输入密码
  4.    read -t 20 -sp "Enter password in 20 seconds(again)> " pass2 && printf "\n" &&  #第二次输入密码
  5.    [ $pass1 == $pass2 ]  #判断两次输入的密码是否相等
  6. then
  7.    echo "Valid password"
  8. else
  9.    echo "Invalid password"
  10. fi

    这段代码中,我们使用**&&**组合了多个命令,相当于其他语言中的 and ,这些命令会依次执行,并且从整体上作为 if 语句的判断条件。只要其中一个命令执行失败(退出状态为非 0 值),整个判断条件就失败了,后续的命令也就没有必要执行了。

  1. 如果两次输入密码相同,运行结果为:
  2. Enter password in 20 seconds(once) >
  3. Enter password in 20 seconds(again)>
  4. Valid password

  5. 如果两次输入密码不同,运行结果为:
  6. Enter password in 20 seconds(once) >
  7. Enter password in 20 seconds(again)>
  8. Invalid password

  9. 如果第一次输入超时,运行结果为:
  10. Enter password in 20 seconds(once) > Invalid password

  11. 如果第二次输入超时,运行结果为:
  12. Enter password in 20 seconds(once) >
  13. Enter password in 20 seconds(again)> Invalid password

    关于 echo 和 read 的使用方式还有很多,大家可以通过 help echo 和 help read 的方式去获取更多的帮助文档。

任务描述

本关继续带领大家了解掌握 shell 的内置命令,接下来将会学习内置命令exitdeclare

相关知识

内置命令 —— exit

exit 是一个 Shell 内置命令,用来退出当前 Shell 进程,并返回一个退出状态;使用**$?**可以接收这个退出状态,$?如果不记得是什么,请查看前一章节的shell变量。exit 命令可以接受一个整数值作为参数,代表退出状态。如果不指定,默认状态值是 0。

    一般情况下,退出状态为 0 表示成功,退出状态为非 0 表示执行失败(出错)了, exit 退出状态只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败。

    Shell 进程执行出错时,可以根据退出状态来判断具体出现了什么错误,比如打开一个文件时,我们可以指定 1 表示文件不存在,2 表示文件没有读取权限,3 表示文件类型不对。     【实列1】运行该脚本:

  1. #!/bin/bash
  2. echo "befor exit"
  3. exit 8
  4. echo "after exit
  5. [root@localhost ~]$ bash ./test.sh
  6. befor exit

    可以看到,"after exit"并没有输出,这说明遇到 exit 命令后,test.sh 执行就结束了。     注意:exit 表示退出当前 Shell 进程,我们必须在新进程中运行 test.sh,否则当前 Shell 会话(终端窗口)会被关闭,我们就无法看到输出结果了。     我们可以紧接着使用$?来获取 test.sh 的退出状态:

  1.    [root@localhost ~]$ echo $?
  2.    8
内置命令 —— declare

declare一般很少用到,但大家要知道下列常用的方法。

【实列2】declare 将变量声明为整数并进行计算。

  1. #!/bin/bash
  2. declare -i m n ret  #将多个变量声明为整数
  3. m=10
  4. n=30
  5. ret=$m+$n
  6. echo $ret

    如果我们不使用 declare,结果如下所示:

  1. [root@pre-host-work02 ~]# a=10
  2. [root@pre-host-work02 ~]# b=20
  3. [root@pre-host-work02 ~]# c=$a+$b
  4. [root@pre-host-work02 ~]# echo $c
  5. 10+20

    因此注意在 shell 如果要求整数值的话,不要忘了有 declare 这样的内置命令来定义变量。关于 declare 的其他使用方式,大家可以自行去了解。

编程要求

补全右侧编辑器 Begin-End 区间的代码,完成指定功能,具体要求如下:

1.现有变量 a、b、c ,已知 a 为整数 100,b 为整数 300,c=$a+$b,打印 c 的值,应该为 400; 2.补全[ $? -eq ]内的值,-eq 的意思是‘等于’,注意 [ ] 两边要留一个空格,通过 $? 判断上面的命令是否运行成功,如果运行成功则输出success ,否则输出 faild

注意:请不要直接输出 400 或者直接输出 success,因为评测程序会判断你的代码文件。

任务描述

本关任务:掌握函数的创建和使用方法。

相关知识

函数是一个脚本代码块,你可以为其命名并在代码中任何位置重用。要在脚本中使用该代码块时,只要使用所起的函数名就行了(这个过程称为调用函数)。本关将会介绍如何在 shell 脚本中创建和使用函数。

创建函数

有两种格式可以用来在 bash shell 脚本中创建函数。

  • 第一种格式采用关键字 function,后跟分配给该代码块的函数名。
  1. function name {
  2. commands
  3. }

参数说明:

  1. name 属性定义了赋予函数的唯一名称。脚本中定义的每个函数都必须有一个唯一的名称。
  2. commands 是构成函数的一条或多条 bash shell 命令。在调用该函数时,bash shell 会按命令在函数中出现的顺序依次执行,就像在普通脚本中一样。
  • 定义函数的第二种格式更接近于其他编程语言中定义函数的方式。
  • i. name() {
  • ii. commands
  • iii. }

函数名后的空括号表明正在定义的是一个函数。这种格式的命名规则和之前定义 shell 脚本函数的格式一样。

使用函数

【实例1】要在脚本中使用函数,只需要像其他 shell 命令一样,在行中指定函数名就行了。 已知 cat test.sh 显示内容如下:

  1. #!/bin/bash
  2. # using a function in a script
  3. function func1 {
  4. echo "This is an example of a function"
  5. }
  6. count=1
  7. while [ $count -le 5 ]
  8. do
  9. func1
  10. count=$[ $count + 1 ]
  11. done
  12. echo "This is the end of the loop"
  13. func1                             # 指定函数名即可调用函数
  14. echo "Now this is the end of the script"

执行输出结果如下:

  1. This is an example of a function
  2. This is an example of a function
  3. This is an example of a function
  4. This is an example of a function
  5. This is an example of a function
  6. This is the end of the loop
  7. This is an example of a function
  8. Now this is the end of the script

每次引用函数名 func1 时,bash shell 会找到 func1 函数的定义并执行你在那里定义的命令。 【实例2】函数的调用要在函数定义之后使用,否则会报错。

  1. #!/bin/bash

  2. echo "hello function"
  3. fun1
  4. fun1(){
  5. echo "i am func1"
  6. }

执行结果如下:

  1. # bash a.sh
  2. hello function
  3. a.sh: line 6: fun1: command not found

【实例3】函数名必须是唯一的,否则也会有问题。如果你重定义了函数,新定义会覆盖原来函数的定义,这一切不会产生任何错误消息。

  1. #!/bin/bash

  2. fun1(){
  3. echo "i am func1"
  4. }

  5. fun1(){
  6. echo "i am new func1"
  7. }

  8. fun1

执行结果如下:

  1. i am new func1

编程要求

在右侧编辑器 Begin-End 区间补充代码,调用 welcome 函数输出指定内容。

相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
目录
相关文章
|
16天前
|
算法 Linux 调度
深入理解Linux操作系统的进程管理
本文旨在探讨Linux操作系统中的进程管理机制,包括进程的创建、执行、调度和终止等环节。通过对Linux内核中相关模块的分析,揭示其高效的进程管理策略,为开发者提供优化程序性能和资源利用率的参考。
42 1
|
4天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
44 13
|
17天前
|
安全 Linux 数据安全/隐私保护
深入Linux操作系统:文件系统和权限管理
在数字世界的海洋中,操作系统是连接用户与硬件的桥梁,而Linux作为其中的佼佼者,其文件系统和权限管理则是这座桥梁上不可或缺的结构。本文将带你探索Linux的文件系统结构,理解文件权限的重要性,并通过实际案例揭示如何有效地管理和控制这些权限。我们将一起航行在Linux的命令行海洋中,解锁文件系统的奥秘,并学习如何保护你的数据免受不必要的访问。
|
18天前
|
搜索推荐 Linux
深入理解Linux操作系统的启动过程
本文旨在揭示Linux操作系统从开机到完全启动的神秘面纱,通过逐步解析BIOS、引导加载程序、内核初始化等关键步骤,帮助读者建立对Linux启动流程的清晰认识。我们将探讨如何自定义和优化这一过程,以实现更高效、更稳定的系统运行。
|
15天前
|
存储 缓存 网络协议
Linux操作系统的内核优化与性能调优####
本文深入探讨了Linux操作系统内核的优化策略与性能调优方法,旨在为系统管理员和高级用户提供一套实用的指南。通过分析内核参数调整、文件系统选择、内存管理及网络配置等关键方面,本文揭示了如何有效提升Linux系统的稳定性和运行效率。不同于常规摘要仅概述内容的做法,本摘要直接指出文章的核心价值——提供具体可行的优化措施,助力读者实现系统性能的飞跃。 ####
|
16天前
|
缓存 监控 网络协议
Linux操作系统的内核优化与实践####
本文旨在探讨Linux操作系统内核的优化策略与实际应用案例,深入分析内核参数调优、编译选项配置及实时性能监控的方法。通过具体实例讲解如何根据不同应用场景调整内核设置,以提升系统性能和稳定性,为系统管理员和技术爱好者提供实用的优化指南。 ####
|
19天前
|
运维 监控 Linux
Linux操作系统的守护进程与服务管理深度剖析####
本文作为一篇技术性文章,旨在深入探讨Linux操作系统中守护进程与服务管理的机制、工具及实践策略。不同于传统的摘要概述,本文将以“守护进程的生命周期”为核心线索,串联起Linux服务管理的各个方面,从守护进程的定义与特性出发,逐步深入到Systemd的工作原理、服务单元文件编写、服务状态管理以及故障排查技巧,为读者呈现一幅Linux服务管理的全景图。 ####
|
21天前
|
消息中间件 安全 Linux
深入探索Linux操作系统的内核机制
本文旨在为读者提供一个关于Linux操作系统内核机制的全面解析。通过探讨Linux内核的设计哲学、核心组件、以及其如何高效地管理硬件资源和系统操作,本文揭示了Linux之所以成为众多开发者和组织首选操作系统的原因。不同于常规摘要,此处我们不涉及具体代码或技术细节,而是从宏观的角度审视Linux内核的架构和功能,为对Linux感兴趣的读者提供一个高层次的理解框架。
|
1月前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
58 0
Vanilla OS:下一代安全 Linux 发行版
|
1月前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
58 4
下一篇
DataWorks