【条件判断】

1. 按文件类型进行判断

  -b 文件    判断该文件是否存在,并且为块设备文件(是块设备文件为真)

  -c 文件    判断该文件是否存在,并且为字符设备文件(是字符设备文件为真)

  -d 文件    判断该文件是否存在,并且为目录文件(是目录为真)

  -e 文件    判断该文件是否存在(存在为真)

  -f 文件    判断该文件是否存在,并且为普通文件(是普通文件为真)

  -L 文件    判断该文件是否存在,并且为符号链接文件(是符号链接文件为真)

  -p 文件    判断该文件是否存在,并且为管道文件(是管道文件为真)

  -s 文件    判断该文件是否存在,并且为非空(非空为真)

  -S 文件    判断该文件是否存在,并且为套接字文件(是套接字文件为真)

两种判断格式:

① test -e /root/install.log

② [ -e /root/install.log ]

[ -f /root/install.log ] && echo 'yes' || echo 'no'

2. 按照文件权限进行判断(不区分所有者, 所属组)

  -r 文件    判断该文件是否存在,并且拥有读权限(有读权限为真)

  -w 文件    判断该文件是否存在,并且拥有写权限(有写权限为真)

  -x 文件    判断该文件是否存在,并且拥有执行权限(有执行权限为真)

  -u 文件    判断该文件是否存在,并且拥有SUID权限(有SUID权限为真)

  -g 文件    判断该文件是否存在,并且拥有SGID权限(有SGID权限为真)

  -k 文件    判断该文件是否存在,并且拥有SBit权限(有SBit权限为真)

3. 两个文件之间进行比较

  文件1 -nt 文件2    判断文件1的修改时间是否比文件2的新(如果新则为真)

  文件1 -ot 文件2    判断文件1的修改 时间是否比文件2的旧

  文件1 -ef 文件2    判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法。

4. 两个整数之间比较

  整数1 -eq 整数2    判断整数1是否和整数2相等(相等为真)

  整数1 -ne 整数2    判断整数1是否和整数2不相等(不相等为真)

  整数1 -gt 整数2    判断整数1是否大于整数2(大于为真)

  整数1 -lt 整数2    判断整数1是否大于整数2(小于为真)

  整数1 -ge 整数2    判断整数1是否大于等于整数2(大于等于为真)

  整数1 -le 整数2    判断整数1是否小于等于整数2(小于等于为真)

  [ 1 eq 2 ] && echo 'yes' || echo 'no'

5. 字符串的判断

  -z 字符串    判断字符串是否为空(为空返回真)

  -n 字符串    判断字符串是否为非空(非空返回真)

  字符串1 == 字符串2    判断字符串1和字符串2是否相等(相等返回真)

  字符串1 != 字符串2    判断字符串1是否和字符串2不相等(不相等返回真)

  

  name=chen

  [ -z "$name" ] && echo 'yes' || echo 'no'

6. 多重条件判断

  判断1 -a 判断2    逻辑与,判断1和判断2都成立,最终的结果才为真

  判断1 -o 判断2    逻辑或,判断1和判断2有一个成立,最终的结果就为真

  ! 判断    逻辑非,使原始的判断式取反

  

  a=24

  [ -n "$a" -a "$a" -gt 23 ] && echo 'yes' || echo 'no'

【流程控制 - if 语句】

1. 单分支if条件语句

if [ 条件判断式 ]; then程序
fi

if test -z "$ac_version"; then​程序
fi

或者

if [ 条件判断式 ]then程序
fi

注意:

① if开头,fi结尾

② [ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格

③ then后面跟符合条件之后执行的程序,可以放在[]之后,用" ; "分割,也可以换行写入,就不需要" ; "了。

#!/bin/bash
# 统计根分区使用率rate=$(df -h | grep "/dev/sda3" | awk '{print $5}' | cut -d "%" -f1) # 把根分区使用率作为变量值赋予变量rateif [ $rate -ge 80 ]; thenecho "Warning! /dev/sda3 is full !"
fi

2. 双分支if条件语句

if [ 条件判断式 ]then条件成立时,执行的程序else条件不成立时,执行的另一个程序
fi

#!/bin/bash
# 备份mysql数据库ntpdate asia.pool.ntp.org &> /dev/null    # 同步系统时间(需联网)date=$(date +%y%m%d)    # 把当前系统时间按照"年月日"格式赋予变量datesize=$(du -sh /var/lib/mysql)    # 统计mysql数据库的大小,并把大小赋予size变量if [ -d /tmp/dbbak ]thenecho "Date: $date!" > /tmp/dbbak/dbinfo.txtecho "Data size: $size" >> /tmp/dbbak/dbinfo.txtcd /tmp/dbbaktar -zcf mysql-lib-$date.tar.gz /var/lib/mysql dbinfo.txt&> /dev/null  # 把所有输出丢弃rm -rf /tmp/dbbak/dbinfo.txt  # 卸磨杀驴elsemkdir /tmp/dbbak...
fi

#!/bin/bash
# 判断Apache是否启动 ( 先安装nmap:rpm -ivh http://nmap.org/dist/nmap-4.68-1.i386.rpm )port=$(nmap -sT 192.168.1.156 | grep tcp | grep http | awk '{print $2}')    # 使用nmap命令扫描服务器,并截取apache服务的状态,赋予变量port
if [ "$port" == "open" ]thenecho "$(date) httpd is ok!" >> /tmp/httpd-acc.log  # 如果状态正常,追加到日志中else/etc/rc.d/init.d/httpd start &> /dev/null  # 把所有输出丢弃echo "$(date) httpd reboot!" >> /tmp/httpd-err.log  # 重启记录追加到错误日志
fi

3. 多分支if条件语句

if [ 条件判断式1 ]then当条件判断式1成立时,执行程序1elif [ 条件判断式2 ]then当条件判断式2成立时,执行程序2...更多判断...else当所有条件都不成立时,最后执行此程序
fi

#!/bin/bash
# 判断用户输入的是什么文件read -p "Please input a filename:" file # 接收键盘的输入,并赋予变量fileif [ -z "$file" ]thenecho "Error, please input a filename"exit 1elif [ ! -e "$file" ]    # 判断file的值是否存在thenecho "Your input is not a file!"exit 2elif [ -f "$file" ]    # 判断file的值是否为普通文件thenecho "$file is a regular fie!"elif [ -d "$file" ]thenecho "$file is a directory!"elseecho "$file is an other file!"
fi

【流程控制 - case 语句】

多分支case条件语句:case语句只能判断一种条件关系,而if语句可以判断多种条件关系。

case $变量名 in"值1")如果变量的值等于值1,则执行程序1;;"值2")         如果变量的值等于值2,则执行程序2;;*)如果变量的值都不是以上的值,则执行此程序;;
esac

#!/bin/bash
# 判断用户输入
read -p "Please choose yes/no" -t 30 chocase $cho in"yes")echo "You choose yes";;"no")echo "You choose no";;*)echo "You choose none";;
esac

【流程控制 - for 循环】

语法1:

for 变量 in 值1 值2 值3... ; do程序
done

语法2:

for (( 初始值; 循环控制条件; 变量变化 ))do程序done

#!/bin/bash
# 打印时间
for time in morning noon afternoon evening ; doecho "This time is $time"
donefor i in 1 2 3 4 ; doecho $i
done

#!/bin/bash
# 批量解压缩脚本cd /lnmp
ls *.tar.gz > ls.logfor i in $(cat ls.log) ; dotar -zxf $i &> /dev/null
done
rm -rf /lnmp/ls.log

#!/bin/bash
# 求和s=0
for (( i=1; i<=100; i++ )) ; dos=$(( $s + $i ))
done
echo "The sum of 1+2+3+...+100 is : $s"

#!/bin/bash
# 批量添加指定数量的用户read -p "Please input user name:" -t 30 name
read -p "Please input the number of users:" -t 30 num
read -p "Please input the password of users:" -t 30 pass# -a用于连续多个条件判断
if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]theny=$(echo $num | sed 's/^[0-9]*$//g')    # 任意数字替换为空if [ -z "$y" ]    # 如果y的值是空,则num是数字thenfor (( i=0; i<=$num; i++ ))do/usr/sbin/useradd $name$i &> /dev/nullecho $pass | /usr/bin/passwd --stdin "$name$i" &> /dev/nulldonefi
fi

【流程控制 - while 和 until 循环】

while循环是条件循环,只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。

while [ 条件判断式 ]do程序done

#!/bin/bash
# 示例用法while [ $# -gt 0 ]; docase "$#" in3)echo "第一个参数是$1, 参数个数是$#";;4)echo "第一个参数是$1, 参数个数是$#";;*)echo 'What happened';;esac    # 与case对应构成case语句,形如if和ficase "$#" inabc)...  ;;esacshift    # 用shift命令把位置参数左移
done

运行如:./example.sh 3 4 5

until循环:和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环。

#!/bin/bashi=1
s=0
until [ "$i" -gt 100 ]    # 循环直到变量i的值大于100就停止循环dos=$(( $i + $s))i=$(( $i + 1 ))done
echo "The sum is : $i"

【总结】

Shell适用:帮助管理员减少重复操作或进行运维操作,不适合进行复杂的运算的场合。

如何建立编程思想:学习,练习,知道让程序帮你干什么。

转载于:https://www.cnblogs.com/wanglijun/p/8707621.html

[Shell]条件判断与流程控制:if, case, for, while, until相关推荐

  1. Shell攻关之条件判断与流程控制

    条件判断与流程控制 一.条件判断式语句 1.按照文件类型判断 (1) 常用: -d 文件 判断该文件是否存在,并且是否为目录文件(是目录为真)-e 文件 判断该文件是否存在(存在为真)-f 文件 判断 ...

  2. Shell程序设计 | 基本语法 :变量、I/O、算术运算、条件判断、流程控制、函数

    文章目录 变量 环境变量 位置变量 特殊变量 自定义变量 数组 I/O printf / echo read 算术运算 let expr 条件判断 test 常用判断条件 流程控制 if case f ...

  3. Linux【实操篇】—— Shell 编程入门、变量、运算符、条件判断、流程控制

    目录 一.Shell 编程入门 1. 认识 Shell 2. Shell 脚本的创建与执行 二.Shell 变量 1. 系统变量和自定义变量 2. 变量的基本规则 3. 设置环境变量 4. 位置参数变 ...

  4. shell 判断_shell之条件判断和流程控制

    上一篇我们讲了基本运算符,和本篇文章密切关联,可以说每一门语言,都少不了流程控制,相信大家在日常的开发中也不陌生,代码中,我们总要写这样那样的判断.其实流程控制的本质是差不多的,只是在语法上稍微有些差 ...

  5. Linux疑难杂症解决方案100篇(六)-SHELL编程条件判断和流程控制

    今日目标: 熟悉条件判断语句,如判断整数.判断字符串等 熟悉流程控制语句基本语法,如if-else- 一.条件判断语法结构 思考:何为真(true)?何为假(false)? 1. 条件判断语法格式 格 ...

  6. Shell之函数及流程控制语序

    Shell之函数及流程控制语序 脚本中的函数 作用: 把一个复杂的语句块定义成一个字符串的方法 把一个脚本写成一个变量,用变量去调动程序 例如: 一个重复检测网络是否畅通的脚本: #!/bin/bas ...

  7. linux中shell条件判断if中的-a到-z的意思

    2019独角兽企业重金招聘Python工程师标准>>> 下面我们一起来看一篇关于shell条件判断if中的-a到-z的意思,有需要了解的朋友不防进入参考参考. [ -a FILE ] ...

  8. Shell脚本中的流程控制,如if判断,case语句,for循环,while循环

    一.流程控制 1.if 判断 1.基本语法 if [ 条件判断式 ];then程序 fi 或者 if [ 条件判断式 ]then程序 fi 注意事项: (1)[ 条件判断式 ],中括号和条件判断式之间 ...

  9. false shell 判断_Shell 流程控制

    Shell 流程控制 和Java.PHP等语言不一样,sh的流程控制不可为空,如(以下为PHP流程控制写法): <?php if (isset($_GET["q"])) {s ...

最新文章

  1. 因为名字叫True,她被苹果iCloud服务器拒绝了
  2. 图解 VS2015 如何打包winform 安装程序
  3. vimrc-20201028重新配置
  4. Linux 查看磁盘分区、文件系统、磁盘的使用情况相关的命令和工具介绍
  5. 秘密开发一年多,解密奥运史上首个数字云徽章
  6. CCNA 02 OSI七层
  7. 方根法公式_仓储管理笔记之库存分析法:ABC分析法、区域合并法......
  8. php中in array循环,在php中in_array的使用方法
  9. 安卓游戏开发推箱子_保持冷静并砍箱子-开发
  10. python3 class init_python3 module中__init__.py的需要注意的地方
  11. HTML/CSS入门及基础
  12. 工控系统安全测试平台及攻防验证【会议】
  13. [Ting's笔记Day6]活用套件carrierwave gem:(1)在Rails实现图片上传功能
  14. IOI2008 island
  15. 这是属于你我平凡人的荣耀
  16. python的手机官方下载地址,手机python下载安装教程
  17. VS Code 高效“摸鱼”插件推荐
  18. 简单入门排序算法(直接插入排序,折半插入排序,希尔排序,冒泡排序,堆排序,归并排序)
  19. 两台云服务器怎么共享文件夹,云服务器怎么共享文件夹
  20. 自动化测试与自动化测试生命周期

热门文章

  1. Hystrix之外健壮微服务的新选择:Sentinel 发布首个生产版本 1
  2. vue组件通信v兄弟组件通信eventbus遇到的问题(多次触发、第一次不触发)
  3. Day5---D4:合规和审计管理
  4. 桌面支持--打印机任务取消不了
  5. ubuntu下快速安装adb,fastboot的方法。
  6. Extjs4中up()和down()的用法以及组件查找_ComponentQuery类
  7. extjs获取当前时间
  8. Android RelativeLayout和LinearLayout性能分析
  9. @responseBody注解的使用
  10. Vue—基础概念—组建化