3.Shell字符串对比

Shell字符串对比

1.字符串比对,字符串必须使用双引号

[ "name" = "name" ] 
[ "name" != "name" ] 
[root@web ~]# [ "$USER" = "root" ]
[root@web ~]# echo $USER
root
[root@web ~]# [ "$USER" = "root" ]
[root@web ~]# echo $?
0
[root@web ~]# [ "$USER" = "alex" ]
[root@web ~]# echo $?
1
[root@web ~]# [ "$USER" != "alex" ]
[root@web ~]# echo $?
0
  1. -z字符串为空,输出正确 -n字符串为非空,输出正确
    [root@web ~]# name=""
    [root@web ~]# [ -z $name ]
    [root@web ~]# echo $?
    0
    [root@web ~]# [ ! -z $name ]
    [root@web ~]# echo $?
    1
    [root@web ~]# name="alex"
    [root@web ~]# [ -z $name ]
    [root@web ~]# echo $?
    1
    [root@web ~]# [ -n $name ]
    [root@web ~]# echo $?
    0
  1. -z 案例:
    read -p "请输入名字" name1 
    [ -z $name1 ] && echo "请输入姓名否则不继续执行" && exit
    read -p "请输入年龄" age1
    echo $name1 $age1

Shell正则比对

  1. [[ ]]
    [[]]
    [root@web01 scripts]# [ "$USER" = "root" ]
    [root@web01 scripts]# echo $?
    0
    [root@web01 scripts]# [[ "$USER" =~ ^r ]]
    [root@web01 scripts]# echo $?
    0
    [root@web01 scripts]# [[ "$USER" =~ t$ ]]
    [root@web01 scripts]# echo $?
    0
    [root@web01 scripts]# [[ ! "$USER" =~ t$ ]]
    [root@web01 scripts]# echo $?
    1

2.判断传参的参数是否为整数

    方法一:
    [root@web01 scripts]# age=188
    [root@web01 scripts]# [[ "$age" =~ ^[0-9]+$ ]]
    [root@web01 scripts]# echo $?
    0
    [root@web01 scripts]# age=188q
    [root@web01 scripts]# [[ "$age" =~ ^[0-9]+$ ]] && echo $?
    [root@web01 scripts]# [[ "$age" =~ ^[0-9]+$ ]] || echo $?
    1
    [root@web01 scripts]# age=18.8
    [root@web01 scripts]# [[ "$age" =~ ^[0-9]+$ ]]
    [root@web01 scripts]# echo $?
    1
    方法二:
    expr $1 + 0 >/dev/null 2>&1
    [ $? -ne 0 ] && exit

多整数比对

  1. -a and
    -o or

    [ 10 -eq 10 -a 100 -ne 100 ]
    [root@web01 scripts]# [ 10 -eq 10 -a 100 -ne 100 ]
    [root@web01 scripts]# echo $?
    1
    [root@web01 scripts]# [ 10 -eq 10 -a 100 -eq 100 ]
    [root@web01 scripts]# echo $?
    0
    [root@web01 scripts]# [ 10 -eq 10 -o 100 -ne 100 ]
    [root@web01 scripts]# echo $?
    0
    
    [root@web01 scripts]# [[ 10 -eq 10 && 100 -ne 100 ]]
    [root@web01 scripts]# [[ 10 -eq 10 -a 100 -ne 100 ]]
    -bash: 条件表达式中有语法错误
    -bash: `-a' 附近有语法错误
    [root@web01 scripts]# [[ 10 -eq 10 && 100 -ne 100 ]]
    [root@web01 scripts]# echo $?
    1
    [root@web01 scripts]# [[ 10 -eq 10 || 100 -ne 100 ]]
    [root@web01 scripts]# echo $?
    0
    

    2.案例:传入两个数字 比对两个数字的大小

例如:sh count.sh 10 10 要求判读是否传入两个参数 要求数字加判读是否为整数(禁止if)

​ 10=10

    #!/bin/sh
    [ $# -ne 2 ] && echo "please input two number" && exit
    [[ ! $1 =~ ^[0-9]+$ ]] && echo "请输入整数" && exit 50
    [[ ! $2 =~ ^[0-9]+$ ]] && echo "请输入整数" && exit 100
    [ $1 -eq $2 ] && echo "$1=$2"
    [ $1 -gt $2 ] && echo "$1>$2"
    [ $1 -lt $2 ] && echo "$1<$2"

3.案例:批量创建用户 批量创建10个用户 oldboy1 oldboy2 oldboy3...oldboy10

要求密码统一设置为123456

1.输入用户的前缀oldboy,判断如果为空 则退出

2.输入需要创建用户的个数 10,判断是否为整数

        #!/bin/sh
        #read -p "please input prefix: " name
        #read -p "创建的个数: " num
        for i in {1..10}
        do
            echo oldboy$i
        done

        [root@web01 scripts]# cat useradd.sh 
        #!/bin/sh
        read -p "please input prefix: " name
        read -p "创建的个数: " num
        for i in `seq $num`
        do
            useradd $name$i >/dev/null 2>&1
            echo 123456|passwd --stdin $name$i &>/dev/null
            [ $? -eq 0 ] && echo "$name$i create is ok"
        done

4.案例:判断当前10.0.0.0/24网络中 有哪些IP地址在线 ping通则在线

        #!/bin/sh
        [ -f /etc/init.d/functions ] && . /etc/init.d/functions
        for i in `seq 254`
        do
            { IP=10.0.0.$i
            ping -c 1 -W 1 $IP >/dev/null 2>&1
            [ $? -eq 0 ] && action "ping $IP is" /bin/true
            } &
        done

网络知识

        ip addr add 10.0.0.3/24 dev eth0  临时生效 重启失效
        面试题 配置一条默认网关
        route add default gw 10.0.0.254
        删除网关
        route add default gw 10.0.0.254
        其他方法 静态路由方式
        ip route add 0/0 via 10.0.0.254
        策略路由
        服务器使用vpn常用 网关被替换成vpn
        pptpstup 拨号命令
        查看网关
        route -n
        开机启动配置文件(/etc/rc.local) +x 权限 rc.d/rc.local  (禁止使用alias和变量)

if判断

1.单分支

    if [你有房];then       [ -f file ] && echo ok
    
    if [你有房]
    then
        我就嫁给你
    fi

    双分支
    if [ 你有房 ]          [ -f file ] && echo ok || echo error
    then
        我就嫁给你
    else
        拜拜
    fi

2.多分支

    if [ 你有房 ]
    then
        我就嫁给你
    elif [ 你有钱 ]
    then
        我也嫁给你
    elif [ 你爸是李刚 ]
    then
        我也嫁给你
    elif [ 活好!运维技术好 ]
    then
        我倒贴也嫁给你
    elif [ 你在老男孩学运维 ]
    then
        我考虑考虑
    else
        拜拜
    fi

3.案例:输入两个数字 是否为整数 使用if方式

    #!/bin/bash
    read -p "请输入第一个数字:" num1
    read -p "请输入第二个数字:" num2
    if [ -z $num1 ]
    then
       echo "您输入的第一个数字为空"&& exit
    elif [ -z $num2 ]
    then
       echo "您输入的第二个数字为空"&& exit
    elif [[  "$num1" =~ ^[0-9]+$ && "$num2" =~ ^[0-9]+$ ]]
    then
     
    if [ $num1 -lt $num2 ]
    then
       echo "$num1<$num2"
    elif [ $num1 -gt $num2 ]
    then
       echo "$num1>$num2"
    else
       echo "$num1=$num2"
    fi

    else
        echo "您输入了错误的值!"&& exit
    fi 

4.案例:根据操作系统不同的版本安装不同的源

1.如何取出版本号

2.如何做版本号的比对

3.比对完成执行相对应的安装源

#!/bin/sh
ve=`cat /etc/redhat-release |awk '{print $(NF-1)}'`
#centos6.x使用以上命令获取不到版本号
if [ ${ve%%.*} -eq 7 ]
then
    #判断网络是否通畅ping 如果不通 则重启systemctl restart network 通继续执行
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    #测试wget是否已安装 无安装先安装wget
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
elif [ ${ve%%.*} -eq 6 ]
then
    mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
    wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
fi

5.案例:猜数字

生成一个随机数 1-100之间

RANDOM 随机数的范围 0-32767

取余

echo $((RANDOM%100+1))

用户输入一个数字

判断用户输入的数字如果相等则退出提示猜对了 大了 提示比随机数大 小了 提示 比随机数小

    #!/bin/sh
    ran=`echo $((RANDOM%100+1))`
    while true
    do
        let i++
    read -p "请输入一个数字[1-100]: " num
    if [ $num -gt $ran ];then
        echo "你输入的数字大了"
    elif [ $num -lt $ran ];then
        echo "你输入的数字小了"
    else
        echo "恭喜你猜对了 总共猜了 $i 次"
        exit
    fi
    done
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。