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

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

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

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

read   -p   "大佬请输入您的密码:"   ps
if   [      ${#ps}      -lt      7      ]     
then
echo "大佬您的密码太短!"
else
echo "您的密码真长!"
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 "请您输入备份的目录:"   dir1
if   [  -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 "请您输入新密码: "  pass
if    [    ${#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/bash
hour=`date +%H`

if [ $hour -ge 6 -a $hour -le 10 ];then
	echo "This is morning"
elif [ $hour -ge 11 -a $hour -le 13 ];then
	echo "This is noon"
elif [ $hour -ge 14 -a $hour -le 18 ];then
	echo "This is afternoon"
else
	echo "This is night"
fi
  • 嵌套结构
if 条件测试1	then 命令序列
	if 条件测试1	then 命令序列
	else 命令序列
	fi
else 命令序列
fi

在这里插入图片描述

read -p "Input username: " name
id $name &> /dev/null

if [  $? -eq 0   ];then
echo "$name 存在"

else
        useradd $name
        echo "$name create finished"

#        echo "123456" | passwd --stdin $name &> /dev/null
        read -p "请输入用户密码: "  pass
                if [ ${#pass}  -ge  7  ];then
                echo "$pass" | passwd --stdin $name
                echo "$name 用户密码是 $pass"
                else
                echo "密码不合格" 
                fi
fi
  • 备足

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"]var45使><6if7使zn08shell使nz9? 变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态)

  • 模式匹配: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" in
Y|y|YES|yes|Yes|YeS|YEs)
userdel -r $user
echo "$user is deleted!"
;;
*)
echo "thank you"
;;
esac
#!/usr/bin/bash
#定义目标主机IP
web1=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 in
1)
ssh alice@$web1
;;
2)
ssh alice@$web2
;;
*)
echo '123'
esac

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

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

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

r

ead -p "please input [h for help]: " action
case "$action" in

f)
	fdisk -l
	;;
d)
	df -hT
	;;
m)
	free -m
	;;
u)
	uptime
	;;
q)
	exit
	;;
"")
	;;
*)
	echo "error"
	;;
esac
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值