无论什么编程语言都离不开条件判断(流程控制)。
- 比较 [ 整数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
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