当前位置:首页 > linux基础 > 正文内容

Shell介绍(四)条件表达式,字符串比对

5年前 (2019-09-08)linux基础455
条件表达式
[ ]======test   []常用
[ -f file ] 文件是否存在 且为普通文件 重点
[ -e file ] 文件存在则为真
[ -d file ] 目录存在则为真 重点
[ -x file ] 文件有执行权限则为真
[ -w file ] 文件可写则为真
[ -r file ] 文件可读则为真
[root@web01 scripts]# [ -f /etc/hosts ] && echo 为真 || echo 为假
为真


函数库使用

[root@web01 scripts]# cat ping.sh 
#!/bin/sh
[ -f /etc/init.d/functions ] && . /etc/init.d/functions
read -p "请输入一个网址: " url
ping -c 1 -W 1 $url >/dev/null 2>&1
[ $? -eq 0 ] && action "ping $url is" /bin/true || action "ping $url is" /bin/false


数值的比较

-eq   相等
-ne   不等于
-gt   大于
-ge   大于等于
-lt   小于
-le   小于等于
[root@web01 scripts]# [ 10 -eq 10 ] && echo ok || echo error
ok
[root@web01 scripts]# [ 10 -gt 10 ] && echo ok || echo error
error
字符串比对
[ "name" = "name" ] #等于
[ "name" != "name" ] #不等于
[root@web ~]# echo $USER
root
[root@web ~]# [ "$USER" = "root" ]
[root@web ~]# echo $?
0
[root@web ~]# [ "$USER" = "alex" ]
[root@web ~]# echo $?
1


-z #字符串长度为0为真, -n #字符串长度不为0为真

[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


正则比对

[[ ]]=~ 匹配
[root@web01 scripts]# [[ "$USER" =~ ^r ]]#以r开头
[root@web01 scripts]# echo $?
0
[root@web01 scripts]# [[ "$USER" =~ t$ ]]#以t结尾
[root@web01 scripts]# echo $?
0


多整数比对

-a  and(并且)
-o  or   (或者)
[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]# echo $?
1
[root@web01 scripts]# [[ 10 -eq 10 || 100 -ne 100 ]]
[root@web01 scripts]# echo $?
0
案例: 传入两个数字 比对两个数字的大小
sh count.sh 10 10 要求判读是否传入两个参数 要求数字加判读是否为整数 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"
案例:批量创建用户 批量创建10个用户 oldboy1 oldboy2 oldboy3...oldboy10
要求密码统一设置为123456
1.输入用户的前缀  oldboy
判断如果为空 则退出
2.输入需要创建用户的个数 10
判断是否为整数
[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
案例: 判断当前10.0.0.0/24网络中 有哪些IP地址在线 ping通则在线
[root@web01 scripts]# cat ping.sh 
#!/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


字符串比对

字符串必须使用双引号
[ "name" = "name" ] #等于
[ "name" != "name" ]#不等于
-z#字符串个数等于0  -n#字符串个数不等于0
-z 案例:
read -p "请输入名字" name1 
[ -z $name1 ] && echo "请输入姓名否则不继续执行" && exit
read -p "请输入年龄" age1
echo $name1 $age1


判读传参的参数是否为整数

方法1
[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


方法2

expr $1 + 0 >/dev/null 2>&1
[ $? -ne 0 ] && exit


多整数比对

-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


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

#!/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"
案例:批量创建用户 批量创建10个用户
要求密码统一设置为123456
1.输入用户的前缀  oldboy
判断如果为空 则退出
2.输入需要创建用户的个数 10
判断是否为整数
[root@web01 scripts]# cat useradd.sh
#!/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


“Shell介绍(四)条件表达式,字符串比对” 的相关文章

sersync实时同步

sersync实时同步

实时同步概述实时同步是一种只要当前目录发生变化则会触发一个事件,事件触发后会将变化的目录同步至远程服务器。保证数据的连续性, 减少人力维护成本,解决nfs单点故障实时同步工具选择sersync+rsync(√)、inotify+rsyncInotify是一个通知接口,用来监控文件系统的各种变化,如果...

Rsync文件同步

Rsync文件同步

Rsync基本概述rsync是一款开源、快速、多功能、可实现全量及增量的本地或远程数据同步备份的优秀工具。rsync软件适用于Unix/linux/Windows等多种操作系统平台。Rsync简介rsync英文称为remote synchronizetion,从软件的名称就可以看出来,rsync具有...

NFS文件共享存储

NFS文件共享存储

NFS基本概述NFS是Network File System的缩写及网络文件系统。NFS主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分...

Shell介绍(三)if判断,case控制,for循环,while循环,流程控制语句

if判断单分支if [你有房] then     我就嫁给你 fi多分支if [ 你有房 ] then     我就嫁给你 else   &nbs...

自动化运维(二)Ansible Playbook

自动化运维(二)Ansible Playbook

1.Playbook剧本1.playbook翻译过来就是“剧本”,那playbook组成如下play: 定义的是主机的角色task: 定义的是具体执行的任务playbook: 由一个或多个play组成,一个play可以包含多个task任务简单理解为: 使用不同的模块完成一件事情2.playbook的...