开发者学堂课程【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,此时将会给a、b、c三个变量赋值,回车后输入1、32、3再次进行回车,然后进行输入【root@xuegod63 test】# echo $a $b $c后会输出1、32、3,同理输入【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,而在执行的过程中会要求输入三个值,
如输入aa、bb、cc,此时会输出“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 :,
再输入aa,11,33实现结果的输出的同时以便于实现Read命令的功能。
例子的完整过程如下:
【root@xuegod63 test】# cat read.sh
#!/bin/bash
echo “input first second third :”
read first second third
echo “the first parameter is $first
”
echo
“the 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 命令
(1)expr 命令的作用
expr 命令的作用是对 Shell 变量的算术运算,通过 expr 命令做一些算术运算。
(2)expr 命令对整数型变量的算术运算
首先是 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 输出具体分类,输出分类结果为expand、exportfs、expresskeys、export、expr。接着输入【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
(3)expr 命令在shell中的运用
如果将expr命令运用到shell里,运用举例来说明。如Expr2 程序的例子。
首先输入【root@xuegod63 test】# vim expr.sh进行打开,得到#! /bin/sh,首先对a,b,c进行赋值,即a=10,b=20,c=30,此时value1=`expr $a + $b +$c`相当于expr命令,通过反引号的方式去让`expr $a + $b +$c`先执行,执行后将value1赋值,最后进行输出结果,即echo “The value of valuel is $value1”。
value2、value3、value4也是同理进行赋值与输出结果。保存退出后,看程序是否可以执行,即要输入【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
(4)expr命令在复杂的运算中的运用
此条件下接着了解复杂的运算符与表达式,此时运用举例来加以说明。
如输入【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是没有意义的,需要与流程控制语句相结合。
=====流程控制===
(1)if 语句
if语句是判断如果,如“如果明天晴,就出去玩”。
而If语句的流程,表示为如果if语句的表达式为真,就进行这件事情;如果表达式为假,就直接退出。
if 语句对应的语法为:
If 条件
then
语句
fi
补充/扩展:if和then可以写在一起,用“;”间隔,表示两个命令写在一行,互不影响。
“&”表示前面的命令执行成功才能执行后面的命令,而“;”表示前面的命令成功与否和后面的命令没有任何关系,互相执行。
接下来举例来进行说明
如输入【root@xuegod63 test】# ls /opt/,
这样输出的结果是正常的,但如果输入【root@xuegod63 test】# ls /optt
,输出就会显示报错,
即为ls: cannot access /optt:No such file or directory。
如输入【root@xuegod63 test】# ls /opt && ls
,报错之后就不会列出当下目录的内容,即输出ls: cannot access /optt:No such file or directory
,但如果将“&”写为“;”,
即输入【root@xuegod63 test】# ls /optt ;ls
,此时报错与执行当前目录是分开的,
即输出ls: cannot access /optt:No such file or directory
隔行再输出example01.sh expr.sh read.sh z1.sh z.sh。
例子完整过程如下:
【root@xuegod63 test】# ls /opt && ls
ls: cannot access /optt
:No such file or directory
【root@xuegod63 test】# ls /optt ;ls
ls: cannot access /optt
:No 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
(2)if/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/tes
t
(3)多个条件的联合
如果想多条件联合使用,可以通过一些参数来进行实现。参数如下:
-a或&&:逻辑与,仅当两个条件都成立时,结果为真。
-o或II:逻辑或,两个条件有一个成立,结果为真。
了解参数后,再了解一个更为复杂的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,再输入echo“input 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 . s
h,接下来去执行【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
echo
“input 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