Shell编程条件测试的实现

目录
  • 什么是Shell
  • 编写Shell脚本
  • 条件测试 | 数值测试
  • 条件测试 | 字符串测试
  • 条件测试 | 文件状态测试
  • 条件测试的逻辑操作符

什么是Shell

Shell是一个命令解释器,它会解释并执行命令行提示符下输入的命令。除此之外,Shell还有另一个功能,如果要执行多条命令,它可以将这组命令存放在一个文件中,然后可以像执行Linux系统提供的其他程序一样执行这个文件,这个命令文件就叫做Shell程序或者Shell脚本。当运行这个文件时,它会像在命令行输入这些命令一样顺序地执行它们。

Shell脚本支持变量、命令行参数、交互式输入、函数模块、各种控制语句等高级编程语言的特性,如if、case、while和for等。利用Shell程序设计语言可以编写出功能非常复杂的脚本程序,把大量的任务自动化,尤其是那些需要输入大量命令而在执行过程中不太需要与用户进行干预的系统管理任务。

为了让Shell能读取并且执行Shell程序,Shell脚本的文件权限必须被设置为可读和可执行。为了让Shell可以找到程序,可以选择输入完全路径名,或者将这个脚本的路径放在PATH环境变量指定的路径列表中。Shell脚本不是复杂的程序,它是由上往下逐行解释执行的。脚本的第一行总是以“#!<Shell解释器文件路径>”开始,用来指定该脚本是使用那种Shell进行解释执行。

编写Shell脚本

1)使用VI或者其他任意的文本编辑工具创建一个名为HelloWorld.sh的文件,并在其中加入以下内容:

[root@localhost ~]# vi HelloWorld.sh
#!/bin/bash
#The first Shell script
echo "Hello World!"

2)为HelloWorld.sh文件添加执行权限;

[root@localhost ~]# chmod +x HelloWorld.sh

3)运行HelloWorld.sh脚本,查看运行结果;

[root@localhost ~]# ./HelloWorld.sh

Hello World!

条件测试 | 数值测试

编写Shell脚本时,有时要先测试字符串是否一致、数字是否相等或者检查文件状态,基于这些测试的结果再做下一步的操作。Shell脚本的条件测试可以用于测试字符串、文件状态和数字。

测试完成后可以通过“$?”获取测试的结果,其中0为正确,1为错误。

数值测试用于对两个数值进行比较并得出判断结果,包括:等于、不等于、大于、大于等于、小于、小于等于。

数值判断的格式:[ 数值1 关系运算符 数值2 ]

方括号与条件之间必须要有空格。

数值测试的关系运算符
关系运算符 说明
-eq  两个数值相等
-ne 两个数值不相等
-gt 第一个数大于第二个数
-lt 第一个数小于第二个数
-ge 第一个数大于等于第二个数
-le 第一个数小于等于第二个数

测试两个数值是否相等;

[root@localhost ~]# [ 1024 -eq 1024 ]           //测试1024是否等于1024
[root@localhost ~]# echo $?
0                                               //两个数值相等
修改第一个数值为1124后再次进行测试。
[root@localhost ~]# [ 1124 -eq 1024 ]
[root@localhost ~]# echo $?
1                                               //两个数值不相等
[root@localhost ~]# number1=500                 //number1为500
[root@localhost ~]# number2=254                 //number2为254
[root@localhost ~]# [ $number1 -gt $number2 ]
[root@localhost ~]# echo $?
0                                               //number1大于number2
[root@localhost ~]#

条件测试 | 字符串测试

字符串测试可以对两个字符串的值进行比较,也可以测试单个字符串的值是否为空或者非空。

字符串测试的格式:[ 关系运算符 字符串 ]或者[ 字符串1 关系运算符 字符串2 ]

字符串测试的关系运算符
关系运算符 说明
= 两个字符串相等
!= 两个字符串不相等
-z 字符串为空
-n
字符串不为空

要测试两个字符串是否相等
[root@localhost ~]# [ "abc" = "abc" ]
[root@localhost ~]# echo $?
0                                        //两个字符串相等
把第一个字符串更改为bac后进行测试
[root@localhost ~]# [ "bac" = "abc" ]
[root@localhost ~]# echo $?
1                                        //两个字符串不相等
如果把运算符改为“!=”
[root@localhost ~]# [ "bac" != "abc" ]
[root@localhost ~]# echo $?
0
判断环境变量是否为空或者非空
[root@localhost ~]# [ -z $python1 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# [ -n $python1 ]
[root@localhost ~]# echo $?
0                                        //python1变量为空
[root@localhost ~]# python1="test"       //对python1变量进行赋值
[root@localhost ~]# [ -z $python1 ]
[root@localhost ~]# echo $?
1                                        //python1变量不为空
[root@localhost ~]#

条件测试 | 文件状态测试

Linux的Shell脚本支持对文件状态的检测,包括检测文件的类型、文件的权限和文件的长度等;

文件状态测试的格式:[ 关系运算符 字符串 ]

文件状态测试的关系运算符
关系运算符 说明
-d 目录
-f 一般文件
-L 链接文件
-r
可读

-w 可写
-x 可执行
-u 设置了suid
-s 文件长度大于0、非空
[root@localhost 20190105]# ll
总用量 4
-rwxr-xr-x. 1 root root 56 6月   4 07:55 HelloWorld.sh
[root@localhost 20190105]# [ -r HelloWorld.sh ]
[root@localhost 20190105]# echo $?
0                                                         //HelloWorld.sh 文件可读
[root@localhost 20190105]# [ -w HelloWorld.sh ]
[root@localhost 20190105]# echo $?
0                                                         //HelloWorld.sh 文件可写
[root@localhost 20190105]# [ -x HelloWorld.sh ]
[root@localhost 20190105]# echo $?
0                                                         //HelloWorld.sh 文件可执行
[root@localhost 20190105]#

条件测试的逻辑操作符

逻辑操作符分以下3种:

  • -a:逻辑与,只有当操作符两边的条件均为真时,结果为真,否则为假。
  • -o:逻辑或,操作符两边的条件只要有一个为真,结果为真,只有当两边所有条件为假时,结果为假。
  • !:逻辑否,条件为假,结果为真。
如果要测试两个文件的状态
[root@localhost 20190105]# ll test1 test2
-rw-rw-r--. 1 root root 0 6月   4 09:25 test1
-rw-rw-r--. 1 root root 0 6月   4 09:25 test2
[root@localhost 20190105]# [ -r test1 -a -r test2 ] //测试文件 test1 和 test2 是否都可读
[root@localhost 20190105]# echo $?
0
[root@localhost 20190105]# [ -x test1 -o -x test2 ] //测试文件 test1 和 test2 是否至少有一个可执行
[root@localhost 20190105]# echo $?
1
如果要测试两个数值变量
[root@localhost 20190105]# number1=10
[root@localhost 20190105]# number2=20
[root@localhost 20190105]# [ $number1 -eq 10 -a $number2 -gt 20 ] //测试是否number1 大于10 且 number2 大于20
[root@localhost 20190105]# echo $?
1
如果要测试文件test1 是否为不可读
[root@localhost 20190105]# ls -l test1
-rw-rw-r--. 1 root root 0 6月   4 09:25 test1
[root@localhost 20190105]# [ ! -r test1 ] //测试文件test1 是否为不可读
[root@localhost 20190105]# echo $?
1
[root@localhost 20190105]#

到此这篇关于Shell编程条件测试的实现的文章就介绍到这了,更多相关Shell 条件测试 内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2021-11-23

Shell脚本的条件测试和if条件语句使用方法

一.条件测试操作 要使Shell脚本程序具备一定的"智能",面临的第一个问题就是如何区分不同的情况以确定执行何种操作.Shell环境根据命令执行后的返回状态值(¥?)来判断是否执行成功,当返回值为0时表示成功,否则(非0值)表示失败或异常.使用专门的测试工具--test命令,可以对特定条件进行测试,并根据返回值来判断条件是否成立(返回值为0表示条件成立). 使用test测试命令时,包括以下两种形式: test 条件表达式 [ 条件表达式 ] 这两种方式的作用完全相同,但通常后一种形式更

用shell脚本在mysql表中批量插入数据的方法

很多时候需要在mysql表中插入大量测试数据,下面分享一个用shell脚本通过while循环批量生成mysql测试数据的方法,你只需要根据你自己的表结构来生成sql语句即可. 复制代码 代码如下: #!/bin/bash i=1;MAX_INSERT_ROW_COUNT=$1;while [ $i -le $MAX_INSERT_ROW_COUNT ]do    mysql -uroot -proot afs -e "insert into afs_test (name,age,createTi

shell脚本中echo显示内容带颜色的实现方法

shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-e 格式如下: 复制代码 代码如下: echo -e "\033[字背景颜色:文字颜色m字符串\033[0m" 例如: 复制代码 代码如下: echo -e "\033[41;36m something here \033[0m" 其中41的位置代表底色, 36的位置是代表字的颜色 注: 1.字背景颜色和文字颜色之间是英文的"" 2.文字颜色后面有个m 3.字符串前后可

shell脚本输出多个主机的网卡速率的方法

背景: 记录下之前的写过的shell脚本,需要整理出各个主机的各个网卡速率,网卡名称为bond0到bond3,使用ethtool bond1命令可以查看相应网卡的速率.因为有几十台主机,所以考虑使用shell脚本去查询. 具体思路: 查询单台主机单网卡速率命令: ethtool bond1 | grep Speed Speed: 20000Mb/s 查询单台主机所有bond网卡速率命令,输出网卡名称和对应的网卡速率: for i in {0..3};do echo bond$i `/usr/sb

shell脚本实现批量测试局域网主机是否在线

由于局域网内主机多,VLAN也多,为时常能知道在线主机的数量,编写脚本以查验在线主机. 效果是:主机在线显示绿色,主机离线显示红色结果. 用法:./ping IP段    例如:./ping 192.168.0 复制代码 代码如下: #!/bin/bash NETWORK=$1 for HOST in $(seq 1 254) do         ping -c 1 -w 1 $NETWORK.$HOST &>/dev/null && result=0 || result=

Android之在linux终端执行shell脚本直接打印当前运行app的日志的实现方法

1.问题 我们一般很多时候会需要在ubuntu终端上打印当前运行app的日志,我们一般常见的做法是 1).获取包名 打开当前运行的app,然后输入如下命令,然后在第一行TASK后面的就可以看到包名 adb shell dumpsys activity top 2).我们的终端安装了pidcat.py脚本,然后执行如下的命令就可以打印当前运行app的全日志, pidcat.py packageName 3).思考,为什么每次都需要这样重复的操作呢?一说到重复,我们应该立马想到是否可以用脚本解决重复

Shell脚本实现乱序排列文件内容的多种方法(洗牌问题)

洗牌问题:洗一副扑克,有什么好办法?既能洗得均匀,又能洗得快?即相对于一个文件来说怎样高效率的实现乱序排列? ChinaUnix 确实是 Shell 高手云集的地方,只要你想得到的问题,到那里基本上都能找到答案.r2007给出了一个取巧的方法,利用 Shell 的 $RANDOM 变量给原文件的每一行加上随机的行号然后根据这个随机行号进行排序,再把临时加上去的行号给过滤掉,这样操作之后得到的新文件就相当于被随机"洗"了一次: 复制代码 代码如下: while read i;do ech

Shell脚本中判断变量为数字的3种方法

方法1:通过expr 计算变量与一个整数值相加,如果能正常执行则为整数,否则执行出错,$?将是非0的值 复制代码 代码如下: expr $args + 0 &>/dev/null 方法2:打印变量通过sed替换的方式,将变量中的数字替换为空,如果执行替换后变量为空,则为整数 复制代码 代码如下: echo $args | sed 's/[0-9]//g' 如果判断负数则再用sed过滤负号 复制代码 代码如下: echo $args | sed 's/[0-9]//g' | sed 's/-/

浅谈shell脚本中的控制流结构

习惯了c/c++的编程环境,再转到shell编程上,总有那么一点陌生的感觉. shell中一般的if-then-else函数格式无外乎如下: if 条件1 then 命令1 elif 条件2 then命令2 else 命令3 fi 而linux中 若命令退出状态为0,则退出成功,无错误: 若退出状态为1,则退出失败,某处有错误. if-then-else-函数中,条件1为条件测试,若条件1返回为0,表示测试为真,执行命令1:反之,返回1,则执行elif. 亦即以条件是否测试成功为if的判断标准,

一个下载网页图片的shell脚本

记得去年找工作面试时,听到一位同学说自己非常喜欢linux,我相信他说的是真的,我觉得喜欢linux的人很大的快乐来自shell脚本,因为它能够整合linux上的各种资源干大事.下面和大家分享下一个shell脚本写的图片抓取器.使用方法:复制以下代码,命名为img_downloader.sh.使用时在shell下输入 ./img_downloader.sh www.baidu.com -d images,该shell脚本就会把百度首页上的图片下下来了. 复制代码 代码如下: #!/bin/bas