Shell的条件测试

一、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

5、 2个逻辑符号组合判断

4,多个条件/操作的逻辑组合
&& 之前任务成功就执行之后任务
ls && ls 前一个ls执行成功了,又执行了第二个ls,一共执行2次ls

|| 之前任务失败才执行之后任务
ls || ls 前一个ls执行成功了,不执行第二个ls,一共执行1次ls

#!/bin/bash
[ root != $USER ] && exit      //如果不是管理员执行该脚本,则退出
yum -y install vsftpd
systemctl restart vsftpd
systemctl enable vsftpd

2个逻辑符号组合判断
&& 前后任务都成功,算该组成功
|| 前后任务有一个成功,就算该组成功

ls && ls && ls 第1个ls成功,执行第2个,前2个都成功,执行第3个
ls && ls || ls 第1个ls成功,执行第2个,前2个都成功,不执行第3个
ls || ls || ls 第1个ls成功,不执行第2个,前2个算成功,不执行第3个
ls || ls && ls 第1个ls成功,不执行第2个,前2个算成功,执行第3个
[ root == $USER ] && echo “我是管理员” || echo “我不是管理员”

发布了15 篇原创文章 · 获赞 3 · 访问量 1781

猜你喜欢

转载自blog.csdn.net/weixin_40136446/article/details/104307163