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

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

6年前 (2019-09-08)linux基础886
条件表达式
[ ]======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介绍(四)条件表达式,字符串比对” 的相关文章

Linux文件编辑-VIM编辑器

Linux文件编辑-VIM编辑器

VIM基本概述1.什么是VIM?vi和vim是Linux下的一个文本编辑工具。(可以理解为windows的记事本,或word文档)2.为什么要使用VIM?因为Linux系统一切皆为文件,而我们工作最多的就是修改某个服务的配置(其实就是修改文件内容)。也就是说如果没有vi/vim,我们很多工作都无法完...

Linux单用户和救援模式

Linux单用户和救援模式

Linux单用户模式Centos7使用单用户模式进行变更系统密码第1步:重启Linux系统主机并出现引导界面时,按下键盘上的e键进入内核编辑界面第2步:在linux16这行的后面添加enforcing=0 init=/bin/bash,然后按下Ctrl + X组合键来运行修改过的内核程序第3步:大约...

Linux文件管理-压缩打包

压缩打包介绍windows下我们接触最多的压缩文件就是.rar格式, 但Linux有自己所特有的压缩工具。如果希望windows和Linux互相能使用的压缩工具, 建议.zip格式压缩的好处主要有:1、节省磁盘空间占用率2、节省网络传输带宽消耗3、网络传输更加快捷Linux系统常见的压缩包有哪些类型...

自动化运维(二)Ansible Playbook

自动化运维(二)Ansible Playbook

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

自动化运维(三)Ansible Playbook案例

自动化运维(三)Ansible Playbook案例

Playbook案例1.环境规划角色外网IP(NAT)内网IP(LAN)部署软件m01eth0:10.0.0.61eth1:172.16.1.61ansiblebackupeth0:10.0.0.41eth1:172.16.1.41rsyncnfseth0:10.0.0.31eth1:172.16....