shell编程--判断

测试语法

1.test表达式

test 1 -lt 2

2,[ 条件表达式 ]

最常用

[ 1 -lt 2 ]

3.[[ 条件表达式 ]]

[[ 1 -lt 2 ]]

数值比较

-gt   大于 
-lt   小于
-eq   等于
-ne   不等于
-ge   大于等于
-le   小于等于

[ 20 -gt 10 ]
[ 1 -lt 10 ]
[ 1 -eq 1 ]
[ 1 -ne 10 ]
[ 20 -ge 10 ]
[ 10 -le 10 ]


echo $?
#用来查看上条命令执行结果
0  正确
1,2..其他   错误

例子

  • 猜测用户输入的密码,是否满足长度需求

  • 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 时返回真
    -w pathname : 当由pathname 指定的文件或目录存在并且可写时返回真
    -x pathname : 当由pathname 指定的文件或目录存在并且可执行时返回真
    -O pathname : 当由pathname 存在并且被当前进程的有效用户id 的用户拥有时返回真(字母O 大写)
    -G pathname : 当由pathname 存在并且属于当前进程的有效用户id 的用户的用户组时返回真

    示例

  • [ -f 1.txt ]
    #1.txt文件是否存在
    
    
    [ -e /root/file.sh ]
    #该路径或该路径下的文件存在
    
    
    
    
    [ -w /root/1.sh ]
    #该路径下的文件是否可写

  • 请用户输入备份的路径, 如果存在提示已存在可以备份,如果不存在提示目录不存在请创建。

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

    字符串比较

[ "asdada"="dasdada" ]
=   等于
!=   不等于
-z   判断字符长度是为0
-n   判断字符长度不是0

例子 

  • 邀请用户确认,yes升级装备,no不升级装备

  • read -p "您确定要升级这件装备吗?"  select
    if  [   "$select"    =  "yes"  ]
    then  echo "装备升级开始。。。"
    else  echo "感谢您,欢迎下次光临。"
    fi

    and和or

  • && 逻辑的 AND 的意思, -a ,两个条件同时成立,为真。

  • || 逻辑的 OR 的意思, -o ,两个条件一个成立,为真。

例子

  • 猜测用户输入的密码是否满足如下条件 1.长度大于等于7位 2.包含字母大写 3.包含字母小写 4.包含符号“@!_”

read -p "请您输入新密码: "  pass
if    [    ${#pass}   -gt   7   ]   &&   [[   ${pass}   =~   [a-z]    ]]   &&   [[   ${pass}   =~   [A-Z] ]]  &&   [[   ${pass}   =~   [@_!]   ]]
then echo "您的密码真复杂!!!"
else echo "您的密码太简单!!!"
fi
[root@localhost ~]# [ 1 -lt 2 -a 5 -gt 10 ]
1小于2和5大于10
[root@localhost ~]# [ 1 -lt 2 -o 5 -gt 10 ]
1小于2或5大于10
[root@localhost ~]# [[ 1 -lt 2 && 5 -gt 10 ]]
1小于2和5大于10
[root@localhost ~]# [[ 1 -lt 2 || 5 -gt 10 ]]
1小于2且5大于10
[root@localhost ~]# [ 1 -lt 2 ] && [ 11 -gt 10 ]
1小于2和11大于10

if

示例1

if [ 1 -lt 2 ];then
    command1
    command2
fi
  • 编写脚本,由用户输入用户名,如果用户不存在,则创建该用户

  • #!/bin/bash
    read -p "Input username: " name
    
    id $name &> /dev/null
    
    if [ $? -ne 0 ]; then
    	useradd $name
    fi

    示例2

  • if [ 1 -lt 2 ];then
        command1
    else
        command2
    fi

  • 编写脚本,由用户输入用户名, 如果用户不存在,则创建该用户,并设置密码为123456; 否则,提示用户已经存在

  • #!/bin/bash
    read -p "Input username: " name
    
    id $name  &> /dev/null
    if  [  $?  -ne  0  ]     ;then
    
     
    	echo "$name already exist"
    else
    	useradd $name
    	echo "123456" | passwd --stdin $name &> /dev/null
    	echo "$name create finished,the password is 123456"
    fi
    

    示例3

  • if [ 1 -lt 2 ];then
        command1
    elief [  1 -lt 2 ];then
        command2
    else
        command3
    fi

  • 编写脚本,取出系统时间的小时,对数字进行判断 6--10 this is morning 11-13 this is noon 14-18 this is afternoon 其他 this is night

  • #!/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

    示例4

  • 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
    #${3pass}获取变量长度
                    echo "$pass" | passwd --stdin $name
                    echo "$name 用户密码是 $pass"
                    else
                    echo "密码不合格" 
                    fi
    
    fi

    注意

  • 1、[ ]表示条件测试。注意这里的空格很重要。要注意在'['后面和']'前面都必须要有空格

  • 2、在shell中,then和fi是分开的语句。如果要在同一行里面输入,则需要用分号将他们隔开。

  • 3、注意if判断中对于变量的处理,需要加引号,以免一些不必要的错误。没有加双引号会在一些含空格等的字符串变量判断的时候产生错误。比如[ -n "$var" ]如果var为空会出错

  • 4、判断是不支持浮点值的

  • 5、如果只单独使用>或者<号,系统会认为是输出或者输入重定向,虽然结果显示正确,但是其实是错误的,因此要对这些符号进行转意

  • 6、默认,运行if语句中的命令,所产生的错误信息。仍然出现在脚本的输出结果中

  • 7、使用-z或者-n来检查长度的时候,没有定义的变量也为0

  • 8、空变量和没有初始化的变量可能会对shell脚本测试产生灾难性的影响,因此在不确定变量的内容的时候,在测试号前使用-n或者-z测试一下

  • 9、$? 变量包含了之前执行命令的退出状态(最近完成的前台进程)(可以用于检测退出状态)

case

案例1

case $name in
1|2|3|4)
command1
;;
5|6|7)
command2
;;
*)
command3
;;
esac

邀请用户输入待删除用户名。 询问用户,确定要继续删除吗 yes/no: " y

#!/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

案例2

  • 跳板主机,运行跳板脚本。弹出数十台服务器名的菜单 1)mysql1 2)mysql2 3)bj-web1 ........ h) help q) exit 用户请选择要连接的主机[1-3]: 1 Last login: Sun Sep 6 04:18:01 2023 from 192.168.122.1 [root@localhost ~]$连接成功!!!

  • #!/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
    

    案例3

  • 系统管理工具箱

  • Command action h 显示命令帮助 f 显示磁盘分区 d 显示磁盘挂载 m 查看内存使用 u 查看系统负载 q 退出程序

  • #!/usr/bin/bash
    #打印菜单
    cat <<-EOF
    h. help
    f. disk partation
    d. filesystem mount
    m. memory
    u. system load
    q.exit
    EOF
    
    # 读取用户输入,进行模式匹配
    
    read -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

  • 20
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值