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

  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/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

注意:

  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/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"

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高级Bash脚本编程指南 一本深入学习shell脚本艺术的书籍 Mendel Cooper 春敏 杨 - 毅 黄 - 3.9.1 2006年5月26日 这本书假定你没有任何关于脚本或一般程序的编程知识, 但是如果你具备相关的知识, 那么你将很容易就能够达到中高级的水平. . . 所有这些只是UNIX®浩瀚知识的一小部分. 你可以把本书作为教材, 自学手册, 或者是关于shell脚本技术的文档. 书中的练习和样例脚本中的注释将会与读者进行更好的互动, 但是最关键的前提是: 想真正学习脚本编程的唯一途径就是亲自动手编写脚本. 这本书也可作为教材来讲解一般的编程概念. 本文档的最新版本是作为一个归档文件bzip2-ed, "tar包"来发布的, 其中还包括SGML源代码和编译好的HTML版本. 读者可以从作者的主页上下载. pdf版本也可以从作者的主页上下载. 查看change log来查看校订历史. 贡献 献给Anita, 我所有动力的源泉! 目录 序 1. 原书作者致中国读者(英文) 2. 原书作者致中国读者(译文) 3. 黄毅 4. 杨春敏 第一部分. 热身 1. 为什么使用shell编程? 2. 带着一个Sha-Bang出发(Sha-Bang指的是#!) 2.1. 调用一个脚本 2.2. 初步的练习 第二部分. 基本 3. 特殊字符 4. 变量和参数的介绍 4.1. 变量替换 4.2. 变量赋值 4.3. Bash变量是不区分类型的 4.4. 特殊的变量类型 5. 引用 5.1. 引用变量 5.2. 转义 6. 退出和退出状态码 7. 条件判断 7.1. 条件测试结构 7.2. 文件测试操作符 7.3. 其他比较操作符 7.4. 嵌套的if/then条件测试 7.5. 检测你对测试知识的掌握情况 8. 操作符与相关主题 8.1. 操作符 8.2. 数字常量 第三部分. 进阶 9. 变量重游 9.1. 内部变量 9.2. 操作字符串 9.3. 参数替换 9.4. 指定变量的类型: 使用declare或者typeset 9.5. 变量的间接引用 9.6. $RANDOM: 产生随机整数 9.7. 双圆括号结构 10. 循环与分支 10.1. 循环 10.2. 嵌套循环 10.3. 循环控制 10.4. 测试与分支(case与select结构) 11. 内部命令与内建命令 11.1. 作业控制命令 12. 外部过滤器, 程序和命令 12.1. 基本命令 12.2. 复杂命令 12.3. 时间/日期 命令 12.4. 文本处理命令 12.5. 文件与归档命令 12.6. 通讯命令 12.7. 终端控制命令 12.8. 数学计算命令 12.9. 混杂命令 13. 系统与管理命令 13.1. 分析一个系统脚本 14. 命令替换 15. 算术扩展 16. I/O重定向 16.1. 使用exec 16.2. 代码块重定向 16.3. 重定向的应用 17. Here Document 17.1. Here String 18. 休息片刻 第四部分. 高级主题 19. 正则表达式 19.1. 一份简要的正则表达式介绍 19.2. 通配(globbing) 20. 子shell 21. 受限shell 22. 进程替换 23. 函数 23.1. 复杂函数和函数复杂性 23.2. 局部变量 23.3. 不使用局部变量的递归 24. 别名 25. 列表结构 26. 数组 27. /dev和/proc 27.1. /dev 27.2. /proc 28. Zero与Null 29. 调试 30. 选项 31. 陷阱 32. 脚本编程风格 32.1. 非官方的Shell脚本编写风格 33. 杂项 33.1. 交互与非交互式的交互与非交互式的shell和脚本 33.2. Shell包装 33.3. 测试和比较: 一种可选的方法 33.4. 递归 33.5. 将脚本"彩色化" 33.6. 优化 33.7. 各种小技巧 33.8. 安全问题 33.9. 可移植性问题 33.10. Windows下的shell脚本 34. Bash, 版本2与版本3 34.1. Bash, 版本2 34.2. Bash, 版本3 35. 后记 35.1. 作者后记 35.2. 关于作者 35.3. 译者后记 35.3.1. 杨春敏 35.3.2. 黄毅 35.4. 在哪里可以获得帮助 35.5. 用来制作这本书的工具 35.5.1. 硬件 35.5.2. 软件与排版软件 35.6. 致谢 35.7. 译者致谢

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值