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的判断条件具体可以有以下几种形式

  1. [ express ]
  2. [[ express ]]
  3. test express
  4. bash命令(命令执行成功则执行语句)

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

示例:bash命令做if条件

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

[root@node1 bash_test]# cat 17.sh
#!/bin/bashif id -u hadoop &> /dev/null;thengrep "^hadoop" /etc/passwd | cut -d: -f1,7
elseecho no
fi
[root@node1 bash_test]# ./17.sh
hadoop:/bin/bash

注意:

  1. id -u hadoop &> /dev/null指令的作用是执行id -u hadoop将其回执丢掉(不在终端显示)
  2. 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 $?
1

当然在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/bashif [ $1 -lt 10 ];thenecho Yes
elseecho 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/bashA=$RANDOM
B=$RANDOM
result=""
if [ $A -lt $B ];thenresult="A is greater than B"
elif [ $A -gt $B ];thenresult="A is less then B"
elseresult="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" ];thenif [ -e /var/lock/subsys/script ];thenecho  "script is already running."elsemkdir /var/lock/subsys/scriptecho  "Starting script successfully."fi
elif [ $1 == "stop" ];thenif [ -e /var/lock/subsys/script ];thenrm -rf /var/lock/subsys/scriptecho "Stop script finished."elseecho "script is stopped yet."fi
elif [ $1 == "restart" ];thenrm -rf /var/lock/subsys/scriptmkdir /var/lock/subsys/scriptecho  "Restarting script successfully."
elif [ $1 == "status" ];thenif [ -e /var/lock/subsys/script ];thenecho "script is running."elseecho "script is stopped."fi
elseecho "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/bashif [ ! -e /tmp/test10 ];thenmkdir /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/bashif ! id $1 > /dev/null;thenecho "no find this user"exit 6
elseid $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/bashif [[ $1 == "memory" || $1 == "Memory" ]]; thenfree -tm
elsecat /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条件判断相关推荐

  1. linux grep egrep fgrep bash条件判断 bash测试 if 条件判断

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  2. bash 脚本编程2 条件判断 (笔记)

    条件判断类型: 整数测试 字符测试 文件测试 条件表达式: [ exppression ] ` expression ` test expression 注意一定要加空格前后都要加 整数比较:  -e ...

  3. (转)bash条件判断之if语句

    http://blog.51cto.com/64314491/1629175---------bash条件判断之if语句(一) http://blog.51cto.com/64314491/16292 ...

  4. bash脚本之条件判断

    2019独角兽企业重金招聘Python工程师标准>>> bash中如何实现条件判断? 条件测试类型:         整数测试         字符测试         文件测试 条 ...

  5. bash脚本编程之条件判断、条件测试

    脚本编程: 编程面向过程有如下几种执行方式 顺序执行 选择执行:  如 if, case 循环执行:  如 for, while, until bash的变量类型: 本地变量 set VAR_NAME ...

  6. bash grep 判断_bash 退出状态与条件判断

    摘自<高级bash脚本编程指南> 退出状态和退出状态码 exit 被用来结束一个脚本, 就像在C语言中一样. 它也返回一个值, 并且这个值会传递给脚本的父进程, 父进程会使用这个值做下一步 ...

  7. linux在命令行if,Linux命令之if - Bash中的条件判断语句

    用途说明 Shell中的条件判断语句,与其他编程语言类似. 如果需要知道有哪些条件判断方式,通过man test就可以得到帮助. 常用格式 格式一 if 条件; then 语句 fi 格式二 if 条 ...

  8. bash shell基础之二条件判断

    if 条件判断; then statment else statment fi 或者 if 条件判断; then statment elif statment fi 反引号:将命令的执行结果返回给变量 ...

  9. 第五课-第三讲05_03_bash脚本编程之二 条件判断

    第五课-第三讲05_03_bash脚本编程之二 条件判断 变量名称:只能保含字母数字下划线,且不能数字开头.不能和系统中已存在的环境变量重名.见名知意 bash中如何实现条件判断? 条件测试类型: 整 ...

最新文章

  1. 如何网络推广教大家怎样通过提高用户粘性来助力排名提升?
  2. Oracle存储过程和存储函数创建
  3. maven可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)
  4. qPCR实验疑难杂问解答
  5. sqoop mysql hadoop_使用sqoop将mysql数据导入到hadoop
  6. Android JNI 报错(signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr )
  7. 为什么对开发者很重要?
  8. leetcode 662. Maximum Width of Binary Tree | 662. 二叉树最大宽度(BFS)
  9. svd降维 python案例_菜菜的机器学习sklearn实战-----sklearn中的降维算法PCA和SVD
  10. android ui状态栏高度,Android--状态栏高度,导航栏高度,Window高度,DecorView高度,heightPixels...
  11. python数据归一化
  12. flutter在2019年会有怎样的表现?
  13. SDUT 1149 勾股定理第一弹 勾股数
  14. ubuntu 18.04 LTS 安装SecureCRT
  15. MySQL 数据操作 DML细节
  16. 【面试题记】删除字符串中相邻重复字符
  17. 水泵泵宝显示下池缺水但是水池水很满_水泵控制器不能自动怎么办 显示下池缺水如何处...
  18. CSP-J CSP-S 初赛相关的书籍
  19. java基于微信小程序校园二手闲置商品交易跳蚤市场 uniapp 小程序
  20. 聊聊MultipartFile的transferTo方法

热门文章

  1. 赴京美国大使馆面签日记
  2. Jenkins执行Python代码时提示‘taskkill‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  3. SAP HANA Studio是个啥
  4. Win10安装DBeaver连接MySQL8、导入和导出数据库详细教程
  5. 基于Java Socket通信实现聊天室功能
  6. c语言中秋节编程怎么打,细数中秋节的几种过法,你属于哪一种?
  7. 【C语言】运用easyX——实现实时时钟,给自己的桌面加点料
  8. Flutter 基于AppBar自定义导航栏基类
  9. TypeScript函数与类的使用基础知识点
  10. 2023年企业网盘推荐:实测好用的工具