【实例3】在指定时间内输入密码。
- #!/bin/bash
- if
- read -t 20 -sp "Enter password in 20 seconds(once) > " pass1 && printf "\n" && #第一次输入密码
- read -t 20 -sp "Enter password in 20 seconds(again)> " pass2 && printf "\n" && #第二次输入密码
- [ $pass1 == $pass2 ] #判断两次输入的密码是否相等
- then
- echo "Valid password"
- else
- echo "Invalid password"
- fi
这段代码中,我们使用**&&**组合了多个命令,相当于其他语言中的 and ,这些命令会依次执行,并且从整体上作为 if 语句的判断条件。只要其中一个命令执行失败(退出状态为非 0 值),整个判断条件就失败了,后续的命令也就没有必要执行了。
- 如果两次输入密码相同,运行结果为:
- Enter password in 20 seconds(once) >
- Enter password in 20 seconds(again)>
- Valid password
- 如果两次输入密码不同,运行结果为:
- Enter password in 20 seconds(once) >
- Enter password in 20 seconds(again)>
- Invalid password
- 如果第一次输入超时,运行结果为:
- Enter password in 20 seconds(once) > Invalid password
- 如果第二次输入超时,运行结果为:
- Enter password in 20 seconds(once) >
- Enter password in 20 seconds(again)> Invalid password
关于 echo 和 read 的使用方式还有很多,大家可以通过 help echo 和 help read 的方式去获取更多的帮助文档。
任务描述
本关继续带领大家了解掌握 shell 的内置命令,接下来将会学习内置命令exit
和declare
。
相关知识
内置命令 —— exit
exit 是一个 Shell 内置命令,用来退出当前 Shell 进程,并返回一个退出状态;使用**$?**可以接收这个退出状态,$?
如果不记得是什么,请查看前一章节的shell变量。exit
命令可以接受一个整数值作为参数,代表退出状态。如果不指定,默认状态值是 0。
一般情况下,退出状态为 0 表示成功,退出状态为非 0 表示执行失败(出错)了, exit
退出状态只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败。
Shell 进程执行出错时,可以根据退出状态来判断具体出现了什么错误,比如打开一个文件时,我们可以指定 1 表示文件不存在,2 表示文件没有读取权限,3 表示文件类型不对。 【实列1】运行该脚本:
- #!/bin/bash
- echo "befor exit"
- exit 8
- echo "after exit
- [root@localhost ~]$ bash ./test.sh
- befor exit
可以看到,"after exit"并没有输出,这说明遇到 exit 命令后,test.sh 执行就结束了。 注意:exit 表示退出当前 Shell 进程,我们必须在新进程中运行 test.sh,否则当前 Shell 会话(终端窗口)会被关闭,我们就无法看到输出结果了。 我们可以紧接着使用$?
来获取 test.sh 的退出状态:
- [root@localhost ~]$ echo $?
- 8
内置命令 —— declare
declare
一般很少用到,但大家要知道下列常用的方法。
【实列2】declare 将变量声明为整数并进行计算。
- #!/bin/bash
- declare -i m n ret #将多个变量声明为整数
- m=10
- n=30
- ret=$m+$n
- echo $ret
如果我们不使用 declare,结果如下所示:
- [root@pre-host-work02 ~]# a=10
- [root@pre-host-work02 ~]# b=20
- [root@pre-host-work02 ~]# c=$a+$b
- [root@pre-host-work02 ~]# echo $c
- 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,后跟分配给该代码块的函数名。
- function name {
- commands
- }
参数说明:
- name 属性定义了赋予函数的唯一名称。脚本中定义的每个函数都必须有一个唯一的名称。
- commands 是构成函数的一条或多条 bash shell 命令。在调用该函数时,bash shell 会按命令在函数中出现的顺序依次执行,就像在普通脚本中一样。
- 定义函数的第二种格式更接近于其他编程语言中定义函数的方式。
- i. name() {
- ii. commands
- iii. }
函数名后的空括号表明正在定义的是一个函数。这种格式的命名规则和之前定义 shell 脚本函数的格式一样。
使用函数
【实例1】要在脚本中使用函数,只需要像其他 shell 命令一样,在行中指定函数名就行了。 已知 cat test.sh
显示内容如下:
- #!/bin/bash
- # using a function in a script
- function func1 {
- echo "This is an example of a function"
- }
- count=1
- while [ $count -le 5 ]
- do
- func1
- count=$[ $count + 1 ]
- done
- echo "This is the end of the loop"
- func1 # 指定函数名即可调用函数
- echo "Now this is the end of the script"
执行输出结果如下:
- This is an example of a function
- This is an example of a function
- This is an example of a function
- This is an example of a function
- This is an example of a function
- This is the end of the loop
- This is an example of a function
- Now this is the end of the script
每次引用函数名 func1 时,bash shell 会找到 func1 函数的定义并执行你在那里定义的命令。 【实例2】函数的调用要在函数定义之后使用,否则会报错。
- #!/bin/bash
- echo "hello function"
- fun1
- fun1(){
- echo "i am func1"
- }
执行结果如下:
- # bash a.sh
- hello function
- a.sh: line 6: fun1: command not found
【实例3】函数名必须是唯一的,否则也会有问题。如果你重定义了函数,新定义会覆盖原来函数的定义,这一切不会产生任何错误消息。
- #!/bin/bash
- fun1(){
- echo "i am func1"
- }
- fun1(){
- echo "i am new func1"
- }
- fun1
执行结果如下:
- i am new func1
编程要求
在右侧编辑器 Begin-End 区间补充代码,调用 welcome 函数输出指定内容。