算数表达式-test 测试语句-if 流程控制语句 | 学习笔记

简介: 快速学习算数表达式-test 测试语句-if 流程控制语句

开发者学堂课程【Shell 编程入门到精通算数表达式-test 测试语句-if 流程控制语句】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/453/detail/5594


算数表达式-test 测试语句-if 流程控制语句


内容介绍:

一、Read 命令

二、expr 命令

三、变量测试语句

四、流程控制语句

 

一、Read 命令

如果看到最常见的【root@xuegod63 test# yum install -y,此时不加y并要安装vsftpd 的包,可以看到在执行的时候会有要求输入y的结果,在这种情况下,如果想要实现脚本互动,可以采用 Read 命令。

Read 命令的作用便是可以从键盘上读入数据,赋给变量一个值。例如输入【root@xuegod63 test# read a b c,此时将会给abc三个变量赋值,回车后输入1323再次进行回车,然后进行输入【root@xuegod63 test# echo $a $b $c后会输出1323,同理输入【root@xuegod63 test# $a也是一样得出对应的结果,而Read在这个过程中会帮助其实现命令的交互。

例子的完整过程如下:

root@xuegod63 test# read a b c

1 32 3

root@xuegod63 test# echo $a $b $c

1 32 3

root@xuegod63 test# $a

1

在通过上述例子了解Read命令的作用后,再通过在shell中使用read命令的例子充分理解read命令的作用。

首先要进行输入【root@xuegod63 test# vim a.sh,在总过程中也可将其写成【root@xuegod63 test# cp z.sh read.sh,

得出就是关于read的【root@xuegod63 test# vim read.sh的式子,然后进行打开,打开后将下面的部分进行清空,清空后写入read first second third这三个变量,并将三个变量都进行输出,

即为echo “the first parameter is $first”,echo the second parameter is $second”,echo the third parameter is $third”,

输出的过程中要运用ctrl+v进行调试。而三行程序的输出结果颜色不同且后面符号也不同,这时要了解在 vim 编辑 shell 脚本时是有语法加量功能的,出错时会进行提示,而这个脚本中出错的原因在于运用了中文的双引号,正确的是应该运用英文的双引号,将其进行改正后恢复正常,然后进行保存退出。

在保存退出后要执行read,即【root@xuegod63 test# ./read.sh,而在执行的过程中会要求输入三个值,

如输入aabbcc,此时会输出“the first parameter is aa”,“the second parameter is bb”,“the third parameter is cc”

如果想使脚本更完善一些,可以在read first second third上面输入echo “input first second third :”,

保存退出后进行执行【root@xuegod63 test# ./read.sh,此时会显示input first second third :

再输入aa1133实现结果的输出的同时以便于实现Read命令的功能。

例子的完整过程如下:

root@xuegod63 test# cat read.sh

#!/bin/bash

echo “input first second third :”

read first second third

echo “the first parameter is $first

echothe second parameter is $second

echo“the third parameter is $third

测试:

root@xuegod63 test# ./read.sh

input first second third :

aa 11 33

the first parameter is aa

the second parameter is 11

the third parameter is 33

the first parameter is $first”

echo “the second parameter is $second”

echo “the third parameter is $third”

要清楚通过 echo 写一些很长的提示符也是可以的

 

二、expr 命令

1expr 命令的作用

expr 命令的作用是对 Shell 变量的算术运算,通过 expr 命令做一些算术运算。

2expr 命令对整数型变量的算术运算

首先是 expr 命令对整数型变量进行算术运算,如想知道3+5等于多少,而对于此运算结果的得出有多种方法,此方法是最基础简单的方法,首先输入【root@xuegod63 test# expr 3 + 5 其中运算符之间必须要有空格,如“3”,“+“,”5“之间有要有空格相隔,最后输出结果为8

而从上述例子中可以得出expr的语法:

expr 表达式,而其中要特别注意运算符之间必须要有空格。

expr命令的运用也较为广泛,如每天用来重启服务的也是 expr 命令,如【root@xuegod63 test# vim/etc/init.d/network 进行打开时出现的# /bin/bash 便是 expr 定理下的 bash,如if等做一些判断的也是 expr 命令。

清楚expr命令的运用后,再进行一些举例来深入了解 expr 命令。如首先输入【root@xuegod63 test# var1=8,此时注意赋值时是不需要空格进行间隔的,再输入【root@xuegod63 test# var2=2,再通过输入【root@xuegod63 test# exp 输出具体分类,输出分类结果为expandexportfsexpresskeysexportexpr。接着输入【root@xuegod63 test# expr $var1 – 5,通过 expr 的表达式输出结果为3

如想运用 expr 命令进行除法运算,则输入【root@xuegod63 test# expr $var1 / var2,输出结果为4

如想运用 expr 命令进行乘法运算,输入【root@xuegod63 test# expr $var1 * $var2此时输出结果显示为expr: syntax error

,则表明在运算过程中出现了语法错误,此时需要在”\“后加上”*“,因为”*“在shell中表示特殊含义,所以应加\进行转译,意思是不再让*的特殊含义起作用,只当作普通星号进行运算。

正确的运算表达式应为输入【root@xuegod63 test# expr $var1 \* $var2,输出结果为16

例子的完整过程如下:

root@xuegod63 test# expr 3 + 5

8

root@xuegod63 test# var1=8

root@xuegod63 test# var2=2

root@xuegod63 test# exp

expand exportfs   expresskeys

export expr

root@xuegod63 test# expr $var1 – 5

3

root@xuegod63 test# expr $var1 * $var2

expr: syntax error

root@xuegod63 test# expr $var1 \* $var2

16

3expr 命令在shell中的运用

如果将expr命令运用到shell里,运用举例来说明。如Expr2 程序的例子。

首先输入【root@xuegod63 test# vim expr.sh进行打开,得到# /bin/sh,首先对abc进行赋值,即a=10b=20c=30,此时value1=`expr $a + $b +$c`相当于expr命令,通过反引号的方式去让`expr $a + $b +$c`先执行,执行后将value1赋值,最后进行输出结果,即echo “The value of valuel is $value1”

value2value3value4也是同理进行赋值与输出结果。保存退出后,看程序是否可以执行,即要输入【root@xuegod63 test# chmod +x expr . sh,然后再进行输入【root@xuegod63 test#  ./expr . sh,就可以得出值,即输出The value of valuel1 is 60”,” The value of valuel2 is 1”,” The value of valuel3 is 600”,” The value of valuel4 is 11”

此时注意要输入【root@xuegod63 test# cat expr.sh,一定要给执行选项。

而当得出结果时,会发现算除法时与得出结果不符,这说明除法时是采用整除的方法,而加减乘除之间的运算顺序也是正常运算的。

例子的完整过程如下:

root@xuegod63 test# cat expr.sh

# /bin/sh

a=10

b=20

c=30

value1=`expr $a + $b +$c`

echo “The value of valuel is $value1”

value2=`expr $c / $b`

echo “The value of valuel is $value2”

value3=`expr $c \* $b`

echo “The value of valuel is $value3”

value4=`expr $a + $c /$b`

echo “The value of valuel is $value4”

测试:

root@xuegod63 test#  ./expr . sh

The value of valuel1 is 60

The value of valuel2 is 1

The value of valuel3 is 600

The value of valuel4 is 11

4expr命令在复杂的运算中的运用

此条件下接着了解复杂的运算符与表达式,此时运用举例来加以说明。

如输入root@xuegod63 test# var4=8,对var4赋值为8,再输入root@xuegod63 test# expr  `expr 5 + 11` / $var4,此时可以再执行一个expr命令,如`expr 5 + 11`,此时不用再输入小括号,反引号相当于小括号,此时要将`expr 5 + 11`看作整体再进行运算,得出结果为2

如输入【root@xuegod63 test# var1=8

再输入【root@xuegod63 test# var2=2,再运用expr命令对var4

进行赋值,即root@xuegod63 test# var4=`expr $var1 / $var2`,最后运用表达式root@xuegod63 test# echo $var4,输出最终结果为4

此时注意反引号与$ls-l)是不一样的,$()是赋值具体的命令,而反引号是让命令做一下执行,然后把命令的结果赋给var4

又如输入root@xuegod63 test# expr 4 – 7,输出最终结果为-3,说明expr命令对负数也是支持的。

例子的完整过程如下:

root@xuegod63 test# var4=8

root@xuegod63 test# expr  `expr 5 + 11` / $var4

2

例:

root@xuegod63 test# var1=8

root@xuegod63 test# var2=2

root@xuegod63 test# var4=`expr $var1 / $var2`

root@xuegod63 test# echo $var4

4


三、变量测试语句

变量测试语句中常用的是 test,格式为 test 加测试条件,即写作 test 测试条件,用来测试是否为真等,测试的范围为整数、字符串、文件。接下来举例来进行具体说明。

1)测试字符串

如测试两个字符串和变量是否相等时,方法如下:

test  str1= =str2 是否相等

test  str1=str2 是否不相等

在测试的过程中,注意变量之间不要留有空格。

如测试字符串是否不空时,具体方法如下:

test   str1 测试字符串是否不空

在测试的过程中,注意如果字符串为不空,返回值是非零的值,否则就是假的。

test  -n str1 测试字符串是否为空

test  -z str1 测试字符串是否为空

在测试的过程中,注意如果字符串为空,返回值是1是真的。

2)测试整数

测试时的基本写法为 test  int1 -eq  int2,而测试方法为 int1是否等于eq

当两个整数大于等于 int1,写作:

test  int1 -ge int2

当两个整数大于 int1,写作:

test  int1 -gt int2

当两个整数小于等于 int1,写作:

test  int1  -le  int2

当两个整数小于 int1,写作:

test  int1  -lt  int2 或写成:【int1  -lt  int2

当两个整数不等于 int1,写作:

test  int1 -ne int2

说明:也可以省略 test 写成【int1 -lt  int2

3)文件测试

当想测试是否文件或目录,方法如下:

test   -d   file   #测试是否为目录

test    -f   file  #测试是否为文件

test   -x   file   #测试是否有可执行权限

test   -r   file   #测试文件是否可读

test   -w   file  #测试文件是否可写

test   -e   file   #测试文件是否存在

test   -s   file   #测试大小是否为空/是否为0/是否为空文件

说明:test   -x   file可简写成:【-x file

 

四、流程控制语句

单独使用test是没有意义的,需要与流程控制语句相结合。

=====流程控制===

1if 语句

if语句是判断如果,如“如果明天晴,就出去玩”。

If语句的流程,表示为如果if语句的表达式为真,就进行这件事情;如果表达式为假,就直接退出。

if 语句对应的语法为:

If 条件

then

语句

fi

补充/扩展:ifthen可以写在一起,用“;”间隔,表示两个命令写在一行,互不影响。

&”表示前面的命令执行成功才能执行后面的命令,而“;”表示前面的命令成功与否和后面的命令没有任何关系,互相执行。

接下来举例来进行说明

如输入root@xuegod63 test# ls /opt/这样输出的结果是正常的,但如果输入root@xuegod63 test# ls /optt,输出就会显示报错,

即为lscannot access /opttNo such file or directory

如输入root@xuegod63 test# ls /opt  && ls,报错之后就不会列出当下目录的内容,即输出ls: cannot access /opttNo such file or directory,但如果将“&”写为“;”,

即输入root@xuegod63 test# ls /optt ls,此时报错与执行当前目录是分开的,

即输出ls: cannot access /opttNo such file or directory隔行再输出example01.sh  expr.sh  read.sh z1.sh  z.sh

例子完整过程如下:

root@xuegod63 test# ls /opt  && ls

ls: cannot access /opttNo such file or directory

root@xuegod63 test# ls /optt ls

ls: cannot access /opttNo such file or directory

example01.sh  expr.sh read.sh z1.sh  z.sh

清楚以上补充说明的知识点的区别后,接下来看if的例子。

如首先输入【root@xuegod63 test# vi if.sh vi,但vi没有语法加量功能,所以选择使用【root@xuegod63 test# vim if.sh,接下来打开写入#/bin/bash,换行输出 echo “if test”,进行输出测试。

再写入if -x/bin/ls】,注意两边都有空格,如果执行bin下有ls,如果文件可以执行,两边都有空格,然后用“;“进行分割,则写作if -x/bin/ls 】 ;then,后面再加表达式/bin/ls,如果可以执行后者就可以执行,结尾时为fi,然后保存退出,注意写shell脚本的时候不要一次性写太多,写一段测一段。

然后输入【root@xuegod63 test# chmod +x if . sh,再输入并执行【root@xuegod63 test# ./if . sh,得出if test,是可以执行的,就可以输出当前内容,即example01.sh  expr.sh  if.sh read.sh  z1.sh  z.sh

除了以上写法,也可以写成echo ================”,再输入if-x /bin/ls】,如果可以执行换行输入then,再换行输入语句/bin/ls,最后换行写fi

两种方法都可以进行使用。保存退出后,输入执行【root@xuegod63 test# ./if . sh,在上面没有进行判断的时候,两种结果都等于example01.sh  expr.sh  if.sh read.sh  z1.sh  z.sh,两种方法都可以执行,可得两种写法都可行,输入【root@xuegod63 test# cat if . sh,可以再次证明两种写法都可行,在判断过程中可以使用tab键改成驼峰形式进行规范处理。

例子完整过程如下:

cat if.sh

#/bin/bash

echo “if test”

if -x/bin/ls ; then

/bin/ls

fi

echo=========================

if -x/bin/ls

then

/bin/ls    

fi

运行结果:

root@xuegod63 test# ./if . sh

If test

example01.sh  expr.sh  if.sh read.sh  z1.sh  z.sh

=================================

example01.sh  expr.sh  if.sh read.sh  z1.sh  z.sh

2if/else 用法

if语句外,还有if/else用法。if/else用法为判断如果再,如“如果明天晴就怎么样,如果明天不晴再怎么样“。if/else用法的流程为如果表达式为真,就执行语句1

如果表达式为假的,就执行语句2。这是一种典型的黑白用法。

if/else用法的语法为:

If  条件1 then

命令一

else

命令二

Fi

接下来举例来说明

如首先输入【root@xuegod63 test# vim else . sh,进行打开,打开之后写入一个语法,如果password的事物能执行就执行,如果password的事物执行不了就退出。接下来看etc下的password是否可以执行,输入【root@xuegod63 test# ll /etc/passwd,输出结果为- rw – r - - r - - 1 root root 1753 Feb  7 20:57 /etc/passwd,可以得出etc下的password是不可以执行的。

此时,首先写入#!/bin/bash,如果etc下的password是可以执行的,就执行ls,即输入if -x /etc/passwd ; then,换行输出/bin/ls,否则的话就执行pwd,即输入else,换行输出pwd,最终结束为fi

保存退出后输入【root@xuegod63 test# chmod +x else . sh显示当前目录的路径,然后输入【root@xuegod63 test# ./else . sh进行执行,输出/root/test,可知执行的是pwd

然后给一个执行的权限,即输入【root@xuegod63 test# chmod +x /etc/passwd,但正常是不应该给执行权限的,然后就可以执行,在可以执行的基础上可以输出结果为else . sh  expr . sh  read . sh z.sh,隔行再输出example01.sh  if . sh z1 . sh,即输出结果为else并列出了当前目录下的内容。此时再输入【root@xuegod63 test# cat else.sh进行执行。

例子完整过程如下:

root@xuegod63 test# cat else.sh

#!/bin/bash

if -x /etc/passwd ; then

/bin/ls

else

pwd

fi

执行结果:

root@xuegod63 test# chmod +x else . sh

root@xuegod63 test# ./else . sh

/root/test

3)多个条件的联合

如果想多条件联合使用,可以通过一些参数来进行实现。参数如下:

-a&&:逻辑与,仅当两个条件都成立时,结果为真。

-oII:逻辑或,两个条件有一个成立,结果为真。

了解参数后,再了解一个更为复杂的if语句。

语法:

if  条件1  then

命令1

elif  条件2  then

命令2

elif  条件3  then

命令3

else

命令4

fi

接下来通过一个综合的实例来进行具体说明,将更复杂的if语句的语法与多条件联合的参数结合。

首先输入root@xuegod63 test# vim elif . sh,然后打开,首先写入#!/bin/bash,再输入echoinput a file name”,输入名字,然后通过read读取名字,即输入read file_name,如果输入的名字是一个目录,就执行输出,即输入if -d $file_name;  then,输出echo$file_name is a dir”

否则,如果输入的名字是一个普通文件,则执行输出,即输入if -f $file_name;  then,输出echo$file_name is a file”。如果输入的名字是一个字符设备文件或-b文件,则执行输出,即输入if - c $file_name – o – b $ file_name;  then,输出echo$file_name is a device file”

如果以上条件都不符合,则执行输出,即输入else,输出echo$file_name is an unknow file”最终输入fi,保存退出。

保存退出后输入root@xuegod63 test# chmod +x elif . sh,接下来去执行root@xuegod63 test# ./elif . sh,这时会显示输入一个名字,即输入input a file name:,假如说输入/etc/passwd,这时会输出结果为/etc/passwd is file,即etc为一个普通文件。

接着输入/etc,这时会输出结果为/etc is a dir ,etc为一个目录。再输入/dev/sda,这时会显示结果为/dev/sda is a device file,即sda为一个设备文件。

再输入/etc/aaaa,这时会显示结果为/etc/aaaa is an uknown file,即aaaa为一个不知名文件。

这就是完整的综合实例,是用来测试文件类型的,

综合实例完整过程如下:

root@xuegod63 test# cat elif . sh

#!/bin/bash

echoinput a file name:”

read file_name

if -d $file_name;  then

echo$file_name is a dir”

elif -f $file_name; then

echo$file_name is a file”

elif - c $file_name – o – b $ file_name ;  then

echo$file_name is a device file”

else

echo$file_name is an unknow file”

f

相关文章
|
7月前
|
Python
Python中 If语句条件测试
Python中 If语句条件测试
79 1
|
2月前
|
测试技术
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
本文介绍了如何使用Pytest和Allure生成自动化测试报告。通过安装allure-pytest和配置环境,可以生成包含用例描述、步骤、等级等详细信息的美观报告。文章还提供了代码示例和运行指南,以及重构项目时的注意事项。
245 1
自动化测试项目学习笔记(五):Pytest结合allure生成测试报告以及重构项目
|
2月前
|
测试技术 Python
自动化测试项目学习笔记(四):Pytest介绍和使用
本文是关于自动化测试框架Pytest的介绍和使用。Pytest是一个功能丰富的Python测试工具,支持参数化、多种测试类型,并拥有众多第三方插件。文章讲解了Pytest的编写规则、命令行参数、执行测试、参数化处理以及如何使用fixture实现测试用例间的调用。此外,还提供了pytest.ini配置文件示例。
47 2
|
2月前
|
测试技术 Python
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
本文主要介绍了自动化测试中setup、teardown、断言方法的使用,以及unittest框架中setUp、tearDown、setUpClass和tearDownClass的区别和应用。
73 0
自动化测试项目学习笔记(二):学习各种setup、tearDown、断言方法
|
4月前
|
JavaScript 前端开发 测试技术
Vue.js开发者必看!Vue Test Utils携手端到端测试,打造无懈可击的应用体验,引领前端测试新风尚!
【8月更文挑战第30天】随着Vue.js的普及,构建可靠的Vue应用至关重要。测试不仅能确保应用质量,还能提升开发效率。Vue Test Utils作为官方测试库,方便进行单元测试,而结合端到端(E2E)测试,则能构建全面的测试体系,保障应用稳定性。本文将带你深入了解如何使用Vue Test Utils进行单元测试,通过具体示例展示如何测试组件行为;并通过Cypress进行E2E测试,确保整个应用流程的正确性。无论是单元测试还是E2E测试,都能显著提高Vue应用的质量,让你更加自信地交付高质量的应用。
81 0
|
4月前
|
Java 测试技术
Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了
Java SpringBoot Test 单元测试中包括多线程时,没跑完就结束了
84 0
|
5月前
|
Java 测试技术 程序员
测试气味Test Smells-整洁单元测试
摘要:本文讨论了代码中的“Code Smell”现象,即可能表明代码质量问题的模式。这些包括重复代码、过长函数、过大类、过长参数列表等。识别并重构Code Smell有助于提升代码质量和可维护性。在单元测试中,也有类似的“测试味道”问题,如无信息的测试名称、缺少arrange-act-assert结构、不恰当的变量名和重复使用以及杀虫剂效应。好的单元测试应有明确的命名、遵循arrange-act-assert模式、使用有意义的变量名,并避免重复测试同一情况,以提供有价值的错误信息。
|
6月前
|
Java
springboot Test 测试类中如何排除一个bean类
springboot Test 测试类中如何排除一个bean类
150 0
|
7月前
|
Java 测试技术 编译器
JMM测试利器-JCStress学习笔记
JMM测试利器-JCStress学习笔记
|
7月前
|
测试技术 Shell Android开发
随机测试 Monkey Test
随机测试 Monkey Test
183 0