bash if条件判断
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/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
注意:
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 $?
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条件判断相关推荐
- 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 ...
- bash 脚本编程2 条件判断 (笔记)
条件判断类型: 整数测试 字符测试 文件测试 条件表达式: [ exppression ] ` expression ` test expression 注意一定要加空格前后都要加 整数比较: -e ...
- (转)bash条件判断之if语句
http://blog.51cto.com/64314491/1629175---------bash条件判断之if语句(一) http://blog.51cto.com/64314491/16292 ...
- bash脚本之条件判断
2019独角兽企业重金招聘Python工程师标准>>> bash中如何实现条件判断? 条件测试类型: 整数测试 字符测试 文件测试 条 ...
- bash脚本编程之条件判断、条件测试
脚本编程: 编程面向过程有如下几种执行方式 顺序执行 选择执行: 如 if, case 循环执行: 如 for, while, until bash的变量类型: 本地变量 set VAR_NAME ...
- bash grep 判断_bash 退出状态与条件判断
摘自<高级bash脚本编程指南> 退出状态和退出状态码 exit 被用来结束一个脚本, 就像在C语言中一样. 它也返回一个值, 并且这个值会传递给脚本的父进程, 父进程会使用这个值做下一步 ...
- linux在命令行if,Linux命令之if - Bash中的条件判断语句
用途说明 Shell中的条件判断语句,与其他编程语言类似. 如果需要知道有哪些条件判断方式,通过man test就可以得到帮助. 常用格式 格式一 if 条件; then 语句 fi 格式二 if 条 ...
- bash shell基础之二条件判断
if 条件判断; then statment else statment fi 或者 if 条件判断; then statment elif statment fi 反引号:将命令的执行结果返回给变量 ...
- 第五课-第三讲05_03_bash脚本编程之二 条件判断
第五课-第三讲05_03_bash脚本编程之二 条件判断 变量名称:只能保含字母数字下划线,且不能数字开头.不能和系统中已存在的环境变量重名.见名知意 bash中如何实现条件判断? 条件测试类型: 整 ...
最新文章
- 如何网络推广教大家怎样通过提高用户粘性来助力排名提升?
- Oracle存储过程和存储函数创建
- maven可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)
- qPCR实验疑难杂问解答
- sqoop mysql hadoop_使用sqoop将mysql数据导入到hadoop
- Android JNI 报错(signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr )
- 为什么对开发者很重要?
- leetcode 662. Maximum Width of Binary Tree | 662. 二叉树最大宽度(BFS)
- svd降维 python案例_菜菜的机器学习sklearn实战-----sklearn中的降维算法PCA和SVD
- android ui状态栏高度,Android--状态栏高度,导航栏高度,Window高度,DecorView高度,heightPixels...
- python数据归一化
- flutter在2019年会有怎样的表现?
- SDUT 1149 勾股定理第一弹 勾股数
- ubuntu 18.04 LTS 安装SecureCRT
- MySQL 数据操作 DML细节
- 【面试题记】删除字符串中相邻重复字符
- 水泵泵宝显示下池缺水但是水池水很满_水泵控制器不能自动怎么办 显示下池缺水如何处...
- CSP-J CSP-S 初赛相关的书籍
- java基于微信小程序校园二手闲置商品交易跳蚤市场 uniapp 小程序
- 聊聊MultipartFile的transferTo方法
热门文章
- 赴京美国大使馆面签日记
- Jenkins执行Python代码时提示‘taskkill‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- SAP HANA Studio是个啥
- Win10安装DBeaver连接MySQL8、导入和导出数据库详细教程
- 基于Java Socket通信实现聊天室功能
- c语言中秋节编程怎么打,细数中秋节的几种过法,你属于哪一种?
- 【C语言】运用easyX——实现实时时钟,给自己的桌面加点料
- Flutter 基于AppBar自定义导航栏基类
- TypeScript函数与类的使用基础知识点
- 2023年企业网盘推荐:实测好用的工具