shell基础(4):编程基础之测试和判断

导读:本篇文章讲解 shell基础(4):编程基础之测试和判断,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

通过测试
通过判断我们可以根据测试结果,做出相应的操作

一. 测试

测试是判断命令的执行过程,返回0则判断为真,返回非0则判断为假。

测试结构
测试的第一种使用方式是直接使用test命令,该命令的格式如下:

test expression

expression是一个表达式,可以是算术比较、字符串比较、文本和文件属性比较等。

第二种测试方式是使用“[”启动一个测试,再写expression,再以“]”结束测试。注意,左边的括号“[”后有个空格,右括号“]”前面也有个空格。

[ expression ]

 

1. 文件测试

“测试文件是否存在”就是“文件测试”的一种典型需求,其格式如下:

#文件测试方法一
test file_operator FILE
#文件测试方法二
[ file_operator FILE ]

其中file_operator是文件测试符(如下图),FILE是文件、目录(可以是文件或目录的全路径)。

在这里插入图片描述

判断文件是否存在

lianggao@bogon ~ % [ -e MyWorkSpace/001project/wcJava.zip ]
lianggao@bogon ~ % echo $?
0

 

文件测试脚本小例

判断文件是否存在、可读、可写、可执行。

[root@tbds-10-1-0-38 log]# cat rxx.sh 
#!/bin/bash
#read命令用于从标准输入读取数值。-p:后面跟提示信息,即在输入前打印提示信息。
read -p "what file do you want to test" filename
if [ ! -e "$filename" ]; then
  echo "the file does not exits"
  exit 1
fi
 
if [  -r "$filename" ]; then
  echo "$filename can read"
fi
 
if [ -w "$filename" ]; then
  echo "$filename can write"
fi
 
if [ -x "$filename" ]; then
  echo "$filename can excute"
fi
[root@tbds-10-1-0-38 log]# bash rxx.sh 
what file do you want to test ./rxx.sh
./rxx.sh can read
./rxx.sh can write
[root@tbds-10-1-0-38 log]# bash rxx.sh 
what file do you want to test /11.txt
the file does not exits

 
 

2. 字符串测试

Shell中的字符串比较主要有等于、不等于、大于、小于、是否为空等测试。

字符串测试符
111121212121

[root@docp82 ~]# str1=""
[root@docp82 ~]# str2="hello"

[root@docp82 ~]# [ -z  "${str1}"  ]
[root@docp82 ~]# echo $?
0
[root@docp82 ~]# [ -z  "${str2}"  ]
[root@docp82 ~]# echo $?
1
[root@docp82 ~]# [   "${str2}" = "${str1}"  ]
[root@docp82 ~]# echo $?
1
[root@docp82 ~]# [   "${str2}" != "${str1}"  ]
[root@docp82 ~]# echo $?
0
[root@docp82 ~]# [   "${str2}" > "${str1}"  ]
-bash: : No such file or directory
[root@docp82 ~]# [   "${str2}" \> "${str1}"  ]
[root@docp82 ~]# echo $?
0
[root@docp82 ~]# [   "${str2}" \< "${str1}"  ]
[root@docp82 ~]# echo $?
1
  1. 需要使用””接收${str1}的变量值
  2. 比较大小时,注意 > 和 < 都需要进行转义。

 

3. 整数测试

整数测试是一种简单的算术运算,作用在于比较两个整数的大小关系,测试成立则返回0,否则返回非0值。

#整数测试方法一
test "num1" num_operator "num2"
#整数测试方法二
[ "num1" num_operator "num2" ]

在这里插入图片描述

[root@docp82 ~]# num1=1
[root@docp82 ~]# num2=2
[root@docp82 ~]# [ "$num1" -gt  "$num2" ]
[root@docp82 ~]# echo $?
1
[root@docp82 ~]# [ "$num1" -lt  "$num2" ]
[root@docp82 ~]# echo $?
0
[root@docp82 ~]# [ "$num1" -eq  "$num2" ]
[root@docp82 ~]# echo $?
1
[root@docp82 ~]# [ "$num1" -ne  "$num2" ]
[root@docp82 ~]# echo $?
0

 

4. 逻辑测试符和逻辑运算符

逻辑测试符(不推荐)
在这里插入图片描述

逻辑运算符(推荐)
在这里插入图片描述
 

使用逻辑运算符去判断

[root@localhost ~]# ! [-e /var/log/messages ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [-e /var/log/messages ] && [-e /var/log/messages01 ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [-e /var/log/messages ] || [-e /var/log/messages01 ]
[root@localhost ~]# echo $?0

不管是逻辑运算符还是逻辑测试符,在做逻辑与、逻辑或运算时逻辑都是一样的。

 

多逻辑运算符使用

将逻辑与、逻辑或的这些特点联合起来使用,使用的方式如下:

expression && DoWhenExpressionTrue || DoWhenExpressionFalse

从左到右,首先计算expression,并返回其值。如果返回真,继续执行&&后的代码DoWhenExpressionTrue,如果该语句执行成功,则expression &&DoWhenExpressionTrue整体返回0,使用||连接的DoWhenExpressionFalse代码将不会被执行;
 
如果expression返回假,则跳过DoWhenExpressionTrue,则用||连接的代码段DoWhenExpressionFalse一定会被执行。

上述代码段其实就是一个隐形的if-then-else语法。

 
 

二. 判断

有了测试,就要有获得测试结果的机制,并根据测试结果运行不同的代码段,这样就可以实现程序的流程控制。

1. if判断结构

if是最简单的判断语句,可以针对测试结果做相应处理:如果测试为真则运行相关代码,其语法结构如下:

if expression; then        
		command
fi

如下脚本会根据输入的学生成绩打印对应的等级:

[root@docp82 ~]# cat xxx.sh 
#!/bin/bash
echo -n "Please input a score"
read score
if [ "$score" -lt 60 ];then
        echo "C"
fi
if [ "$score" -lt 80 -a "$score" -ge 60  ];then
        echo "B"
fi
if [ "$score" -ge 80 ];then
        echo "A"
fi
[root@docp82 ~]# bash xxx.sh 
Please input a score 55
C
[root@docp82 ~]# bash xxx.sh 
Please input a score 88
A
[root@docp82 ~]# bash xxx.sh 
Please input a score 77
B

 

2. if/else判断结构

if expression; then        
	command
else        
	command
fi

判断文件是否存在

[root@docp82 ~]# cat xxx.sh 
#!/bin/bash
File=/data/app/file.sh
if [ -e $File ];then
        echo "$File exists"
else 
        echo "$File not exists"
fi
[root@docp82 ~]# bash xxx.sh 
/data/app/file.sh not exists

 

3. if/elif/else判断结构

通过 if/elif/else的语法完成多向选择

if expression1; then         
	command1
elif expression2; then         
	Command2
elif expression3; then         
	Command3
...
fi

改写if脚本

#!/bin/bash
echo -n "Please input a score"
read score
if [ "$score" -lt 60 ];then
        echo "C"
elif  [ "$score" -lt 80 -a "$score" -ge 60  ];then
        echo "B"
else
        echo "A"
fi                                                    

 

4. case判断结构

case判断结构也可以用于多种可能情况下的分支选择

case VAR in
var1) command1 ;;
var2) command2 ;;
var3) command3 ;;
...
*) command ;;
esac

其原理为从上到下依次比较VAR和var1、var2、var3的值是否相等,如果匹配相等则执行后面的命令语句,在无一匹配的情况下匹配最后的默认*,并执行后面的默认命令。

#!/bin/bash
OS=$(uname -s)
echo "$OS"
case "$OS" in
FreeBSD) echo "This is FreeBSD" ;;
CYGWIN_NT-5.1) echo "This is Cygwin" ;;
SunOS) echo "This is Solaris" ;;
Darwin) echo "This is Mac OSX" ;;
AIX) echo "This is AIX" ;;
Minix) echo "This is Minix" ;;
Linux) echo "This is Linux" ;;
*) echo "Failed to identify this OS" ;;
esac   
[root@docp82 ~]# bash xxx.sh 
Linux
This is Linux

 

用于检测用户的输入中是否含有大写字母、小写字母或者数字的脚本

lianggao@bogon ~ % vim dec.sh 
#!bin/bash
read -p "Give me a word:" input
echo -en "you give me some:"
case $input in
        *[[:lower:]]*) echo -en "Lowercase";;
        *[[:upper:]]*) echo -en "Uppercase";;
        *[:digit:]]*) echo -en "Numerical";;
        *) echo "unkown input";;
esac

lianggao@bogon ~ % bash dec.sh 
Give me a word:gao
you give me some:Lowercase%                               

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/65356.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!