bash if条件判断的使用

 更新时间:2023年02月16日 10:58:05   作者:小青头  
本文主要介绍了bash if条件判断的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在bash中,if是可以对语句做选择执行,做if条件测试有整数测试,字符测试,文件测试三种形式。

if格式

单分支语法

if 条件; then
    语句1
    语句2
    ... 
fi

双分支语法

if 条件;then
    语句1
    语句2
else
    语句2
fi

多分支语法

if 条件1; then
    语句1
    语句2
elif 条件2; then
    语句1
    语句2
else
    语句1
    语句2
fi

条件测试

if的判断条件具体可以有以下几种形式

  • [ express ]
  • [[ express ]]
  • test express
  • bash命令(命令执行成功则执行语句)

[],[[]],test作用类似,基本上在编写bash脚本时可以互换
注意:[],[[]]空格位置;
[1个空格+表达式+1个空格]
[[1个空格+表达式+1个空格]]

示例:bash命令做if条件

示例1:查看系统是否有hadoop用户,如果有返回uid和shell,没有返回no

[root@node1 bash_test]# cat 17.sh 
#!/bin/bash

if id -u hadoop &> /dev/null;then
    grep "^hadoop" /etc/passwd | cut -d: -f1,7
else
    echo no
fi
[root@node1 bash_test]# ./17.sh 
hadoop:/bin/bash

注意:

  • id -u hadoop &> /dev/null指令的作用是执行id -u hadoop将其回执丢掉(不在终端显示)
  • bash命令做if条件时,当命令状态返回值为真即值为0时,条件满足:命令状态返回值1-255即条件不满足

命令状态返回值

我们可以使用$?查看上一条命令的命令状态返回值,命令成功执行返回0,失败执行返回1

[root@node1 bash_test]# id hadoop
uid=4024(hadoop) gid=4024(hadoop) 组=4024(hadoop),4026(mygrp)
[root@node1 bash_test]# echo $?
0
[root@node1 bash_test]# id hadoop111
id: hadoop111: no such user
[root@node1 bash_test]# echo $?

当然在bash脚本中,我们可以使用exit退出程序时,后面接的数字则代表命令执行情况。例如:exit 0代表执行成功,exit 1代表执行失败

整数测试

if条件测试是为了比较整数时,具体规则如下
expression: 数值1 比较符号 数值2
比较符号:
大于 -gt
大于或等于 -ge
等于 -eq
不等于 -ne
小于 -gt
小于或等于 -ge

示例1:读取一个参数,如果他小于10返回Yes,大于10返回No

[root@node1 bash_test]# cat 18.sh 
#!/bin/bash

if [ $1 -lt 10 ];then
  echo Yes
else
  echo No
fi
[root@node1 bash_test]# ./18.sh 5
Yes
[root@node1 bash_test]# ./18.sh 11
No

注意:$1代表终端传入的第一个参数
bash中位置变量有:
$1,$2,$3…
$@ $* 显示所有位置变量
$@ 五个字符串当成一个字符串显示
$* 五个字符串各自显示
$# 显示位置变量个数
$? 保存刚刚执行命令的状态返回值
shift 实现位置参数轮替
结合shfit可以使用一个$1可以得到所有的变量
shfit 2 指定轮替2个

例如:执行命令./18.sh 5
$0为./18.sh
$1为5
@ 和 @和@和* 均为"./18.sh 5"
$#为1

示例2:写一个脚本随机生成两个数,比较其大小

[root@node1 bash_test]# cat 19.sh 
#!/bin/bash

A=$RANDOM
B=$RANDOM
result=""
if [ $A -lt $B ];then
  result="A is greater than B"
elif [ $A -gt $B ];then
  result="A is less then B"
else
  result="A equals B"
fi
echo "A = $A, B = $B, $result"

[root@node1 bash_test]# ./19.sh 
A = 6646, B = 3889, A is less then B

$RANDOM 生成随机数 0-32767之间的数

字符测试

if条件为字符比较大小时,默认以ASCII码表做大小比较
除了使用符号-lt,-gt,-le,-ge,-eq,-ne做判断,我们也可以使用下述符号做判断

 > : 大于
 < : 小于
 == :等于
 != :不等于
单目测试
 -z $STRING 字符串的长度,为空则为真,非空为假
 -n $STRING 为空则为假,不空则真
 =~ 判断左边的字符串是否能够被右边的模式所匹配,通常用于双[[  ]]中
     一般用行首,行尾锚定$,不能用词首词尾锚定\< \> 
    不能用引号

一般我们用==比较多,用来判断两个字符串是否相等

示例1:写一个脚本,可以接受一个参数,其使用形式如下所示:
script.sh {start|stop|restart|status}
其中:
如果参数为start,则创建空文件/var/lock/subsys/script,并显示“starting script successfully.”
如果参数为stop,则删除文件/var/lock/subsys/script,并显示“Stop script successfully.”
如果参数为restart,则删除文件/var/locksubsys/script并重新创建,而后显示“Restarting script successfully.”
如果参数为status,那么:如果文件/var/lock/subsys/script存在,则显示“Script is running…”,否则,则显示“Script is stopped.”
其他任何参数;则显示“script.sh {start|stop|restart|status}”

#!/bin/bash
# echo $1
if [ $1 == "start" ];then
    if [ -e /var/lock/subsys/script ];then
        echo  "script is already running."
    else
        mkdir /var/lock/subsys/script
        echo  "Starting script successfully."
    fi
elif [ $1 == "stop" ];then
    if [ -e /var/lock/subsys/script ];then
        rm -rf /var/lock/subsys/script
        echo "Stop script finished."
    else
        echo "script is stopped yet."
    fi
elif [ $1 == "restart" ];then
    rm -rf /var/lock/subsys/script
    mkdir /var/lock/subsys/script
    echo  "Restarting script successfully."
elif [ $1 == "status" ];then
    if [ -e /var/lock/subsys/script ];then
        echo "script is running."
    else
        echo "script is stopped."
    fi
else
    echo "script.sh {start|stop|restart|status}"
fi

文件测试

对文件进行操作,主要有以下几种

单目测试
 -f 测试其是否为普通文件,即ls -l 时文件类型为-的文件  
 -d 测试其是否为目录文件,即ls -l 时文件类型为-的目录  
 -e 测试文件是否存在,存在为真  
 -r,-w,-x这三个都是判断文件权限,是否有读,写,执行权限  
 -s 测试文件大小是否不空,不空则真,空为假
 -l -b -c这三个判断文件是否为相应类型

示例:如果/tmp/test10不存在,则创建它

[root@node1 bash_test]# cat 21.sh 
#!/bin/bash

if [ ! -e /tmp/test10 ];then
    mkdir /tmp/test10
fi
[root@node1 bash_test]# ls -ld /tmp/test10
ls: 无法访问/tmp/test10: 没有那个文件或目录
[root@node1 bash_test]# ./21.sh 
[root@node1 bash_test]# ls -ld /tmp/test10
drwxr-xr-x 2 root root 6 8月   1 21:21 /tmp/test10

组合条件测试

当有多个判断需要做时,可以使用如下进行连接

符号符号意义示例解释
-a与,符号左右两边都需要满足;[ $A > 300 -a $A < 500 ]A变量值大于300,而且要小于500满足条件
-o或,符号左右两边只要满足一个;[ $B < 10 -o $A > 100 ]B变量小于10或者A变量小于100
!非,将结果取反;[ ! id hadoop &> /dev/null ]如果没有hadoop用户则满足条件

如果使用独立命令做组合条件时,使用与&&,||或,!非

示例1:写一个脚本,给定用户,如果不存在退出脚本

[root@node1 bash_test]# cat 20.sh 
#!/bin/bash

if ! id $1 > /dev/null;then
    echo "no find this user"
    exit 6
else
    id $1
fi
[root@node1 bash_test]# ./20.sh hadoop
uid=4024(hadoop) gid=4024(hadoop) 组=4024(hadoop),4026(mygrp)
[root@node1 bash_test]# ./20.sh hadoop1
id: hadoop1: no such user
no find this user

示例2:通过参数传-一个字符串给脚本,如果传递的字符串为“memory"或"Memory",就以MB为单位显示当前主机的内存信息:否则,就显示/proc/uptime文件的内容。

#!/bin/bash

if [[ $1 == "memory" || $1 == "Memory" ]]; then
   free -tm
else
   cat /proc/uptime
fi

注意:
|| 短路操作,前面为真,不会运行后面
&& 前面为假,无需运算后面

如果我们需要前面为假,运行后面程序,使用||
如果我们需要前面为真,运行后面程序,使用&&

示例1:如果/tmp/test10不存在,则创建它

[ -e /tmp/test10 ] || mkdir /tmp/test10

示例2:如果/tmp/test10文件夹存在,则在该文件夹下创建hello文件

[ -d /tmp/test10 ] && touch /tmp/test10/hello

示例3:如果/tmp/test10/hello文件存在,则显示’exist’;不存在则显示’not exist’

[ -f /tmp/test10/hello ] && echo "exist" || echo "not exist"

到此这篇关于bash if条件判断的使用的文章就介绍到这了,更多相关bash if条件判断内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • shell脚本设置日志格式的方法

    shell脚本设置日志格式的方法

    本文给大家分享shell脚本设置日志格式的相关知识,设置日志级别并输出对应日志,文中还给大家提到了shell输出格式化日志信息的脚本,感兴趣的朋友跟随小编一起看看吧
    2022-10-10
  • Linux 连续执行多条命令的方法(推荐)

    Linux 连续执行多条命令的方法(推荐)

    下面小编就为大家带来一篇Linux 连续执行多条命令的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Shell程序退出状态码的命令详解

    Shell程序退出状态码的命令详解

    在本篇文章当中主要给大家介绍一个shell的小知识——状态码。这是当我们的程序退出的时候,子进程会将自己程序的退出码传递给父进程,有时候我们可以利用这一操作做一些进程退出之后的事情,比如当程序执行失败或者被某个信号杀死我们就可以了解到,然后做出对应的措施
    2022-10-10
  • Linux xargs命令如何将命令的结果作为参数

    Linux xargs命令如何将命令的结果作为参数

    xargs是给命令传递参数的一个过滤器,也是组合多个命令的工具,这篇文章主要介绍了Linux xargs命令如何将命令的结果作为参数,需要的朋友可以参考下
    2023-04-04
  • Shell中if的基本语法和常见判断用法

    Shell中if的基本语法和常见判断用法

    这篇文章主要介绍了Shell中if的基本语法和常见判断用法,本文讲解了if的基本语法、对字符串的判断、对数字的判断、对文件属性的判断、逻辑判断等内容,需要的朋友可以参考下
    2015-06-06
  • shell脚本实现批量采集爱站关键词库

    shell脚本实现批量采集爱站关键词库

    这篇文章主要介绍了shell脚本实现批量采集爱站关键词库,本文工具实现简单,只用一句话实现,需要的朋友可以参考下
    2014-11-11
  • 使用Bash Shell对目录中的文件实现递归式拷贝

    使用Bash Shell对目录中的文件实现递归式拷贝

    这篇文章主要介绍了使用Bash Shell对目录中的文件实现递归式拷贝,适用于Ubuntu等Debian系的Linux系统,需要的朋友可以参考下
    2015-07-07
  • shell 计算器的实现示例

    shell 计算器的实现示例

    在使用Linux时,我们有时会需要做一些计算,那么我们就可能需要用到计算器,本文主要介绍了shell 计算器的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • linux shell之控制台打印各种颜色字体和背景的实现方法

    linux shell之控制台打印各种颜色字体和背景的实现方法

    今天小编就为大家分享一篇关于linux shell之控制台打印各种颜色字体和背景的实现方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-04-04
  • linux 监视端口是否正常的shell脚本

    linux 监视端口是否正常的shell脚本

    linux 监视端口是否正常的shell脚本,需要的朋友可以参考下
    2013-01-01

最新评论