无论什么编程语言都离不开条件判断(流程控制)。

  • 比较 [ 整数1 操作符 整数2 ]

[ 20 -gt 10 ] 大于
[ 1 -lt 10 ] 小于
[ 1 -eq 1 ] 等于
[ 1 -ne 10 ] 不等于
[ 20 -ge 10 ] 大于等于
[ 10 -le 10 ] 小于等于

read   -p   "大佬请输入您的密码:"   psif   [      ${#ps}      -lt      7      ]     thenecho "大佬您的密码太短!"elseecho "您的密码真长!"fi

  • 文件测试 [ 操作符 文件或目录 ]

-f filename : 当filename 存在时返回真
-b filename : 当filename 存在并且是块文件时返回真(返回0)
-d pathname : 当pathname 存在并且是一个目录时返回真
-h filename : 当filename 存在并且是符号链接文件时返回真 (或 -L filename)
-c filename : 当filename 存在并且是字符文件时返回真
-e pathname : 当由pathname 指定的文件或目录存在时返回真
-g pathname : 当由pathname 指定的文件或目录存在并且设置了SGID 位时返回真
-k pathname : 当由pathname 指定的文件或目录存在并且设置了"粘滞"位时返回真
-p filename : 当filename 存在并且是命名管道时返回真
-r pathname : 当由pathname 指定的文件或目录存在并且可读时返回真
-s filename : 当filename 存在并且文件大小大于0 时返回真
-S filename : 当filename 存在并且是socket 时返回真
-t fd : 当fd 是与终端设备相关联的文件描述符时返回真
-w pathname : 当由pathname 指定的文件或目录存在并且可写时返回真
-x pathname : 当由pathname 指定的文件或目录存在并且可执行时返回真
-O pathname : 当由pathname 存在并且被当前进程的有效用户id 的用户拥有时返回真(字母O 大写)
-G pathname : 当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真

read -p "请您输入备份的目录:"   dir1if   [  -d    $dir1   ]then echo "$dir1 存在可以备份"else echo "$dir1 不存在无法备份"fi

  • 字符串比较 [ “字符串” = “字符串” ]

=,等于
!=,不等于
-z:判断字符长度是为0
-n: 判断字符长度不是为0

[root@localhost ~]# BBB=""[root@localhost ~]# echo ${#BBB}0[root@localhost ~]# [ -z "$BBB" ] 字符长度是为0[root@localhost ~]# echo $?0[root@localhost ~]# [ -n "$BBB" ] 字符长度不为0[root@localhost ~]# echo $?1

  • and 和 or

当条件测试比较复杂时,需要多个条件同时成立,就需要混合条件测试了。
&& 逻辑的 AND 的意思, -a ,两个条件同时成立,为真。
|| 逻辑的 OR 的意思, -o ,两个条件一个成立,为真。

read -p "请您输入新密码: "  passif    [    ${#pass}   -gt   7   ]   &&   [[   ${pass}   =~   [a-z]    ]]   &&   [[   ${pass}   =~   [A-Z] ]]  &&   [[   ${pass}   =~   [@_!]   ]]then echo "您的密码真复杂!!!"else echo "您的密码太简单!!!"fi

  • 流程控制:if
  • 单分支结构

语法

if      [       command/test       ]    ;     then 符合该条件执行的语句fi

  • 双分支结构
if 条件测试then 命令序列else 命令序列fi

  • 多分支结构

if 条件测试1
then 命令序列
elif 条件测试2
then 命令序列
elif 条件测试3
then 命令序列…
else 命令序列
fi

#!/bin/bashhour=`date +%H`if [ $hour -ge 6 -a $hour -le 10 ];thenecho "This is morning"elif [ $hour -ge 11 -a $hour -le 13 ];thenecho "This is noon"elif [ $hour -ge 14 -a $hour -le 18 ];thenecho "This is afternoon"elseecho "This is night"fi

  • 嵌套结构
if 条件测试1	then 命令序列	if 条件测试1	then 命令序列	else 命令序列	fielse 命令序列fi

Linux  Shell脚本流控——判断、流程控制_Linux

read -p "Input username: " nameid $name &> /dev/nullif [  $? -eq 0   ];thenecho "$name 存在"elseuseradd $nameecho "$name create finished"#        echo "123456" | passwd --stdin $name &> /dev/nullread -p "请输入用户密码: "  passif [ ${#pass}  -ge  7  ];thenecho "$pass" | passwd --stdin $nameecho "$name 用户密码是 $pass"elseecho "密码不合格" fifi

  • 备足

1、[ ]表示条件测试。注意这里的空格很重要。要注意在’[‘后面和’]'前面都必须要有空格
2、在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。
3、注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "                        v                    a                    r                    "                    ]                    如                    果                    v                    a                    r                    为                    空                    会                    出                    错                    4                    、                    判                    断                    是                    不                    支                    持                    浮                    点                    值                    的                    5                    、                    如                    果                    只                    单                    独                    使                    用                    >                    或                    者                    <                    号                    ,                    系                    统                    会                    认                    为                    是                    输                    出                    或                    者                    输                    入                    重                    定                    向                    ,                    虽                    然                    结                    果                    显                    示                    正                    确                    ,                    但                    是                    其                    实                    是                    错                    误                    的                    ,                    因                    此                    要                    对                    这                    些                    符                    号                    进                    行                    转                    意                    6                    、                    默                    认                    ,                    运                    行                    i                    f                    语                    句                    中                    的                    命                    令                    ,                    所                    产                    生                    的                    错                    误                    信                    息                    。                    仍                    然                    出                    现                    在                    脚                    本                    的                    输                    出                    结                    果                    中                    7                    、                    使                    用                    −                    z                    或                    者                    −                    n                    来                    检                    查                    长                    度                    的                    时                    候                    ,                    没                    有                    定                    义                    的                    变                    量                    也                    为                    08                    、                    空                    变                    量                    和                    没                    有                    初                    始                    化                    的                    变                    量                    可                    能                    会                    对                    s                    h                    e                    l                    l                    脚                    本                    测                    试                    产                    生                    灾                    难                    性                    的                    影                    响                    ,                    因                    此                    在                    不                    确                    定                    变                    量                    的                    内                    容                    的                    时                    候                    ,                    在                    测                    试                    号                    前                    使                    用                    −                    n                    或                    者                    −                    z                    测                    试                    一                    下                    9                    、                         var" ]如果var为空会出错 4、判断是不支持浮点值的 5、如果只单独使用>或者<号,系统会认为是输出或者输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转意 6、默认,运行if语句中的命令,所产生的错误信息。仍然出现在脚本的输出结果中 7、使用-z或者-n来检查长度的时候,没有定义的变量也为0 8、空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下 9、           var"]如果var为空会出错4、判断是不支持浮点值的5、如果只单独使用>或者<号,系统会认为是输出或者输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转意6、默认,运行if语句中的命令,所产生的错误信息。仍然出现在脚本的输出结果中7、使用z或者n来检查长度的时候,没有定义的变量也为08、空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用n或者z测试一下9、? 变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态)

  • 模式匹配:case

shell编程中if和case都是用来做流控的。
下面先通过一个案例1,来了解case的特点。

#!/bin/bash#name#time#1请输入删除的用户名:read -p "please input a username : " user#2请用户确认是否删除read -p "确认删除吗?[yes/no] "      action#3 case 流控写法case "$action" inY|y|YES|yes|Yes|YeS|YEs)userdel -r $userecho "$user is deleted!";;*)echo "thank you";;esac

#!/usr/bin/bash#定义目标主机IPweb1=192.168.122.152
web2=192.168.122.128
mysql1=192.168.122.88#打印跳转菜单cat <<EOF
1.WEB1
2.WEB2
3.MYSQL1
EOF#读取用户输入read -p "input number: " num#判断用户选择case $num in1)ssh alice@$web1;;2)ssh alice@$web2;;*)echo '123'esac

1 输出菜单并测试。
vim systemmanage.sh

#!/usr/bin/bash#打印菜单cat <<-EOF
h. helpf. disk partation
d. filesystem mountm. memory
u. system load
q.exit
EOF

读取用户输入,进行模式匹配

r

ead -p "please input [h for help]: " actioncase "$action" inf)fdisk -l	;;d)df -hT	;;m)free -m	;;u)uptime;;q)exit;;"");;*)echo "error";;esac