条件判断与流程控制

一、条件判断式语句
1.按照文件类型判断
(1)

常用:

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

(2)两种判断格式

test -e /root/install.log[-e /root/install.log]   注:可以再次使用:预定义变量$?
echo $?
返回0表示上一条命令成功执行
返回非0表示上一条命令未成功执行

上述方式不能直观的表现想要的结果,可以使用

[-d /root] && echo "yes" || echo "no"

2.按照文件权限进行判断

常用:-r文件   判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)-w文件   判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)-x文件   断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)

例子:

[-w /root/install.log]

只要该文件拥有该权限,不会判断是所属者或者所属组是否拥有。

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


文件1 -nt 文件2         判断文件1的修改时间是否比文件2的新(如果新则为真)    文件1 -ot 文件2         判断文件1的修改时间是否比文件2的旧(如果旧则为真)    文件1 -ef 文件2         判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法

4.两个整数之间的比较

5.字符串的判断

eg:

[-z $name] && echo yes || echo noaa=11
bb=22
["$aa" == "$bb"]
# 比较字符串,注意,这里的$aa 和 $bb加了双引号

6.多重条件判断

二、单分支if语句
1.

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

单分支条件语句需要注意几个点:
if语句使用fi结尾,和一般语言使用大括号结尾不同
[ 条件判断式 ]就是使用test命令判断,所以中括号和条件判断式之间必须有空格

2.例子1.判断登陆的用户是否root
eg:

#!/bin/bashtest=$(env | grep "USER" | cut -d "=" -f 2)if [ "$test" == "root" ]thenecho "Current user is root."
fi

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

3.例子2:判断分区使用率

#!/bin/bashrate=$(df -h | grep "/dev/sda1" | awk '{print $5}' |  cut -d "%" -f 1)if  [ "$rate" -ge "80" ]thenecho "/dev/sda1 is full"fi

三、双分支if条件语句
1.

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

2.例子3 输入一个字符串,判断是不是目录

read  -t 30  -p "please input a dir:" dir# 等待30秒,输出提示信息if [-d "$dir"]then echo "yes"else echo "no"fi

3.例子4 判断Apache服务是否正常启用

ps aux | grep httpd | grep -v grep    #查询httpd是否启动注:ps aux:查看系统中所有正在运行的进程
grep -v grep:取反,取出不包含grep的行脚本:
#!/bin/bashtest=$(ps aux | grep httpd | grep -v grep)
if [ -n "$test" ]thenecho "httpd is ok!"else/etc/rc.d/init.d/httpd startecho "restart httpd !!"
fi注意:脚本名不应该与服务名相同

四、多分支if条件语句
1.

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

2.例子5 简单计算器

#!/bin/bash read -t 30 -p "Please input num1:" num1 read -t 30 -p "Please input num2:" num2 read -t 30 -p "Please input operator:" ope if [ -n "$num1" -a -n "$num2" -a -n "$ope" ] then test1=$(echo $num1 | sed 's/[0-9]//g') test2=$(echo $num2 | sed 's/[0-9]//g') if [ -z "$test1" -a -z "$test2" ] then if [ "$ope" == '+' ] then result=$(($num1+$num2)) elif [ "$ope" == '-' ] then result=$(($num1-$num2)) elif [ "$ope" == '/' ] then result=$(($num1 / $num2)) elif [ "$ope" == '*' ] then result=$(($num1*num2)) else echo "Error: the input operator is worng, please input +-*/" exit 111 fi else echo "Error: Please input numbers!"  exit 222 fi echo "$num1 $ope $num2 is $result" else echo "Error: You input null value!" exit 333 fi

3.例子6 判断用户输入的是什么文件

#!/bin/bash read -t 30 -p "Please input a file name:" file if [ -z "$file" ] then echo "Error, please input a file name!" exit 11 elif [ ! -e "$file" ] then echo "Your input is not a file name!" exit 22 elif [ -f "$file" ] then echo "$file is a regular file!" elif [ -d "$file" ] then echo "$file is a directory !" else echo "$file is another file!" fi

五、多分支case语句
1.
case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。

case $变量名 in"值1")如果变量的值等于值1,则执行程序1;;                          #注意分号(;)一定要加"值2")如果变量的值等于值2,则执行程序2;;…省略其他分支.…*)如果变量的值都不是以上的值,则执行此程序;;esac

2.例子7

#!/bin/bashread -t 30 -p "please input yes/no:" cho case "$cho" in"yes")echo "yes";;  "no")echo "no";;  *)  echo "please input yes/no again!!!";;  esac

六、for循环
1.语法一

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

eg:

#!/bin/bashfor i in 1 2 3 4 5doecho $idone

2.例子8 for循环批量解压压缩包

##!/bin/bashcd /root/testls *.tar.gz > ls.log            #(>覆盖) ls *.tgz >> ls.log              #(>>追加)for i in $( cat ls.log )do  tar -czf $i &> /dev/null#把执行过程中所有输出信息丢到回收站,不显示在屏幕上donerm -rf ls.log

3.语法二

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

eg:1到100的累加

##!/bin/bashs=0
for (( i=1;i<=100;i=i+1))dos=$(($s+$i))doneecho "sum is: $s"

4.例子9 批量添加删除指定数量的用户

#!/bin/bash#批量添加指定数量的用户实例read -t 30 -p "input user name:" nameread -t 30 -p "input password:" passread -t 30 -p "input user number:" num#检查输入内容是否为非空if [ -n "$name" -a -n "$pass" -a -n "$num" ]then#检查输入的用户数量是否为纯数字 chknum=$( echo "$num" | sed 's/[0-9]//g' )if [ -z "$chknum" ]thenfor (( i=1;i<="$num";i=i+1 ))do#添加用户/usr/sbin/useradd $name$i &>/dev/null#添加用户密码,passwd 的--stdin参数是非交互输入,直接传入密码,不需要第二次确认echo $pass | /usr/bin/passwd --stdin $name$i &>/dev/nullecho "add $i complete"doneelseecho "the num must be number"fielseecho "input can not be null,please input"fi

批量删除用户实例
cat /etc/passwd | grep /bin/bash | grep -v /root | cut -d “:” -f 1 #找出/etc/passwd下的普通用户

#!/bin/bash#批量删除用户user=$(cat /etc/passwd | grep "/bin/bash" | grep -v root | cut -d ":" -f 1)for i in $userdo#删除用户,-r参数是删除用户家目录/usr/sbin/userdel -r $idone

七、while循环和until循环
1.while循环

while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这就和for的固定循环不太一样了。

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

2.例子10

#!/bin/bash#从1加到100i=1s=0while [ $i -le 100 ]#如果变量i的值小于等于100,则执行循环do s=$(( $s+$i ))i=$(( $i+1 ))done echo "The sum is:$s"

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

格式:
until [ 条件判断式 ]do 程序done

4。例子11

#!/bin/bash
#until循环1加到100
sum=0
i=1
until [ $i -gt 100 ]dosum=$(( $sum+$i ))i=$(( $i+1 ))done
echo "The sum is: $sum"

Shell攻关之条件判断与流程控制相关推荐

  1. [Shell]条件判断与流程控制:if, case, for, while, until

    [条件判断] 1. 按文件类型进行判断 -b 文件    判断该文件是否存在,并且为块设备文件(是块设备文件为真) -c 文件    判断该文件是否存在,并且为字符设备文件(是字符设备文件为真) -d ...

  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中的条件判断和比较

    1  shell 的$! ,$?, $$,$@ $n        $1 the first parameter,$2 the second... $#        The number of co ...

  7. false shell 判断_Shell 流程控制

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

  8. shell编程之条件判断语句和流程控制语句

    shell条件判断语句和流程控制语句 文章目录 shell条件判断语句和流程控制语句 一.条件判断语法结构 1. 条件判断语法格式 2. 条件判断相关参数 二.流程控制语句 1. 基本语法结构 2. ...

  9. Shell脚本之条件判断

    1.基本语法 [ condition ](注意condition前后要有空格)注意:条件非空即为true,[ 666 ]返回true,[] 返回false. 2. 常用判断条件 (1)两个整数之间比较 ...

最新文章

  1. python简单界面实现-python实现的简单窗口倒计时界面实例
  2. 巨头纷纷布局,机器视觉迎来黄金期
  3. html5获取域对象,entity-framework – EF5如何获取域对象的导航属性列表
  4. Spring简化Java开发_第1章—Spring之旅—简化Spring的java开发
  5. 这种div高度自适应确定你知道吗?
  6. jupyter中怎么把图形在一个单独的窗口显示_QT绘图中的坐标概念
  7. Vue.js 2.6尝鲜
  8. 纽微特记事:发火说产品差,业务开展不了,怎么不找自已的问题
  9. 开源web管理系统mysql_10个基于Web的开源项目管理系统
  10. ueditor java_编辑器ueditor1.4.3 JAVA环境使用
  11. Git——Gitlab服务单机构建
  12. 计算机组装需要注意什么东西,自己组装电脑需注意事项图文详情
  13. 从0开始使用腾讯云GPU服务器
  14. 邮箱手动修改服务器配置,邮箱登录手动修改服务器配置
  15. 强制双休!传腾讯光子调整加班机制,21 点前必须离开工位
  16. 用canvas画一个太极图(八卦图)
  17. 计算多项式的值——基于C语言程序
  18. 批处理文件的@echo off是什么意思?
  19. 逻辑思维训练500题(带答案)前237题 文末附完整版PDF
  20. 主数据管理平台如何进行模型管理

热门文章

  1. canvas清除画布
  2. this关键字、this关键字应用
  3. MATLAB读取网页内链接,Matlab使用urlread()读取网页乱码问题
  4. 3.神经网络-深度学习入门
  5. C++字符串常用输入方法
  6. OpenCV实战——文本检测
  7. SQL语句练习——查询
  8. 【云服务器 ECS 实战】专有网络 VPC、弹性网卡的概述与配置
  9. Java并发编程进阶——并发锁
  10. 旁路电容和去耦电容基础知识