Shell的条件测试

♀尐吖头ヾ 提交于 2020-02-16 09:56:45

一、Shell

1、简介

这个单词的意思是“外壳的意思”,shell又被称为命令解释器。
它可以识别用户输入的各种命令,并传递给系统。和我们在终端中输入的命令类似,但功能强大的多。
shell可以是用户交互的界面,也可以说是控制系统的脚本语言。

2、Shell的分类

集中常见的Shell

  • Bourne Shell:标识为sh,在许多Unix系统中,是root用户的默认的Shell。
  • Bourne-Again Shell :标识为bash,大多数Linux发行版的默认的Shell。
  • Korn Shell:标识为ksh,向上兼容Bourne Shell,并且包含了 C shell 的很多特性。
  • C Shell:标识为csh,语法上类似C语言。。
    这几种shell程序,多多少少有一些区别。但是最好用的还是Bourne-Again Shell。

3、编写Shell脚本

  • 使用vim编辑器创建一个以.sh结尾的文件。
[root@test opt]# vim HelloWorld.sh
[root@test opt]# cat HelloWorld.sh
#!/bin/bash                   #声明解释器
#The first Shell script.Start with Hello World!       #注释文本
echo "HelloWorld!"                               #执行指令

4、运行脚本的方式

  • (1)赋予文件可执行的权限
    chmod +x 脚本文件路径

  • (2)使用解释器运行脚本
    bash 脚本文件路径

  • (3)使用source命令运行脚本。
    source 脚本文件路径

  • 示例

[root@test opt]# chmod +x HelloWorld.sh 
[root@test opt]# ./HelloWorld.sh   
HelloWorld!

[root@test opt]# bash ./HelloWorld.sh 
HelloWorld!

[root@test opt]# source ./HelloWorld.sh
HelloWorld!

二、条件测试

在编写Shell的时候,需要测试字符串。然后基于这些字符串是否匹配条件来选择下一步动作。

  • 示例
    测试两个数值是否相等
[root@test opt]# [ 1  =   1   ]      #中括号、字符、运算关系符,中间都有空格。
[root@test opt]# echo $?              #$?测试上一条命令执行是否正确,正确为0,失败为1.
0
[root@test opt]# [ 1  =   2   ]
[root@test opt]# echo $?
1

1、数值测试

关系运算符 说明 备注
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
  • 使用常量对比
[root@test opt]# [ 1  -eq   1   ]     #中括号、字符、运算关系符,中间都有空格。
[root@test opt]# echo $?              #$?测试上一条命令执行是否正确,正确为0,失败为1.
0
[root@test opt]# [ 1  -lt   2   ]
[root@test opt]# echo $?
0
  • 使用自定义变量进行测试。

      [root@test opt]# a=100     
      [root@test opt]# b=110
      [root@test opt]# [  $a  -eq  $b  ]
      [root@test opt]# echo $?
      1
    
  • 变量的类型:
    1,自定义变量
    变量名称=变量的值 变量名可以是数字字母下划线,不能是数字开头,不能使用特殊符号
    2,环境变量
    HOSTNAME主机名 USER用户名 UID用户的id号 SHELL用户使用的解释器 PWD当前所在路径 PS1一级提示符 PS2二级提示符 HOME家目录 PATH存储命令的路径
    3,预定义变量和位置变量
    $0 $# $* $$ $? $1 $2 $3…

2、字符串测试

关系运算符 说明 备注
== 字符串相等
!= 字符串不相等
-z 字符串为空
-n 字符串不为空
  • 示例:测试字符串是否相等
[root@test opt]# [ "abc" = "abc" ]
[root@test opt]# echo $?
0
[root@test opt]# [ "abc" = "abc" ]
[root@test opt]# echo $?
0
[root@test opt]# [ "cbc" = "abc" ]
[root@test opt]# echo $?
1
[root@test opt]# [ "cbc" != "abc" ]
[root@test opt]# echo $?
0
  • 示例:判断环境变量是否为空或者非空
[root@test opt]# [  -z  $string1 ]
[root@test opt]# echo $?          
0										//环境变量为空
[root@test opt]# 
[root@test opt]# string1="test"          //对环境变量赋值
[root@test opt]# [ -z $string1 ]
[root@test opt]# echo $?                  
1										//环境变量不为空

3、文件状态测试

关系运算符 说明 备注
-d 目录
-f 普通文件
-l 链接文件(快捷方式)
-r 可读文件 针对当前用户
-w 可写文件 针对当前用户
-x 可执行文件 针对当前用户
-u 设置了suid 针对当前用户
-s 文件长度大于0、非空
  • 示例
    测试HelloWorld.sh文件的访问权限。
[root@test opt]# ls -l HelloWorld.sh 
-rwxr-xr-x. 1 root root 79 214 10:14 HelloWorld.sh
[root@test opt]# [  -r  HelloWorld.sh ]
[root@test opt]# echo $?
0										//文件可读
[root@test opt]# [  -w  HelloWorld.sh ]
[root@test opt]# echo $?
0										//文件可写
[root@test opt]# [  -x  HelloWorld.sh ]
[root@test opt]# echo $?
0										//文件可执行

4、条件测试的逻辑操作符

逻辑操作符 说明 备注
-a 只有当操作符两边的条件均为真时,结果为真;否则为假
-o 操作符两边的条件只要有一个为真,则结果为真;两个都为假时,结果才为假
条件为假;结果为真
  • 示例
[root@test opt]# cp HelloWorld.sh   HelloWorld02.sh 
[root@test opt]# chmod -x HelloWorld02.sh
[root@test opt]# ls -l HelloWorld.sh HelloWorld02.sh
-rw-r--r--. 1 root root 79 214 14:18 HelloWorld02.sh
-rwxr-xr-x. 1 root root 79 214 10:14 HelloWorld.sh

我先把HelloWorld.sh 复制一下,再改个名,把可执行权限取消掉。来做对比。

[root@test opt]# [ -r HelloWorld.sh  -a -r HelloWorld02.sh ]
[root@test opt]# echo $?                 //测试这两个文件是否都可读
0
[root@test opt]# [ -x HelloWorld.sh  -a -x HelloWorld02.sh ]
[root@test opt]# echo $?				//测试这两个文件是否都可执行
1
[root@test opt]# [ -x HelloWorld.sh  -o -x HelloWorld02.sh ]
[root@test opt]# echo $?              //测试这两个文件当中是否有可执行文件
0
[root@test opt]# [ ! -r HelloWorld.sh ]
[root@test opt]# echo $?				//测试这个文件是否不可读
1
  • 2个逻辑符号组合判断
    && 前后任务都成功,算该组成功
    || 前后任务有一个成功,就算该组成功
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!