24_Shell语言————if条件判断之字符测试

前文中介绍过,bash的条件测试主要有以下3类:

整数测试:比较两个整数谁大谁小,是否相等;

字符测试:比较两个字符串是否相等;

文件测试:测试某个文件是否具有读权限、写权限、执行权限等;

整数测试在前文中介绍过,这里着重讲解字符测试。字符测试采用的比较符号是常用的数学符号:

>:大于(在ASCII码表中的先后顺序,从左至右逐字比较)

<:小于

==:等于(注意,= 表示赋值)

=~:判断左边的字符串是否能够被右边的模式所匹配,通常用于双中括号中:

[[ $opt1=~$opt2 ]]

通常做行首行尾锚定,不要加上引号。

上述比较都是两个变量的比较,但bash中也可以进行单目测试,即只测试一个变量:

-z$STRING: 为空则为真,不空则为假

-n$STRING: 为空则为假,不空则真

下面来举例说明字符测试的用法:

例1:写一个脚本,判定用户的shell是否为bash

可以定义一个变量Shell来存放用户的shell,然后做判断:[ “$Shell” == “/bin/bash”],可以现在命令行中初步实验:

[[email protected]]# Shell="/bin/tcsh"

#定义变量Shell,赋值为“/bin/tcsh

[[email protected]]# [ $Shell == "/bin/bash" ]

#判断Shell是否为“/bin/bash

[[email protected]]# echo $?

1

#查看测试结果

[[email protected]]# Shell="/bin/bash"

[[email protected]]# [ $Shell == "/bin/bash" ]

#注意,$Shell最好也加上引号,因为如果字符串中有空格,有可能会被当做多个变量

[[email protected]]# echo $?

0

具体的脚本如下:

[[email protected]]# vim if_shell.sh

#!/bin/bash
#
 
Shell=`grep "^$1:"/etc/passwd | cut -d: -f7`
 
if [ "$Shell" =="/bin/bash" ]; then
        echo "Bash User."
        Ret=0
else
        echo "Not Bash User."
        Ret=9
fi
 
exit $Ret

[[email protected]]# bash -n if_shell.sh

[[email protected]]# bash if_shell.sh root

Bash User.

[[email protected]]# bash -x if_shell.sh daemon

++ cut -d: -f7
++ grep ‘^daemon:‘ /etc/passwd
+ Shell=/sbin/nologin
+ ‘[‘ /sbin/nologin == /bin/bash‘]‘
+ echo ‘Not Bash User.‘
Not Bash User.
+ Ret=9
+ exit 9

[[email protected]]# bash if_shell.sh roott

Not Bash User.

这里roott用户并不存在,如果在脚本中先对用户存在与否做判断,会使得脚本更加完善。可以使用-z来进行字符判断:

 

[[email protected]]# echo $Shell

/bin/bash

[[email protected]]# [ -z $Shell ]

#-z 来判断变量Shell中是否有值,有即为假,无即为真。

[[email protected]]# echo $?

1

[[email protected]]# unset Shell

#撤销变量Shell

[[email protected]]# [ -z $Shell ]

[[email protected]]# echo $?

0

故此脚本可以作如下改进

[[email protected]]# vim if_shell.sh

#!/bin/bash
#
 
Shell=`grep "^$1:"/etc/passwd | cut -d: -f7`
 
if [ -z $Shell ]; then
#先判断变量Shell中是否有值,如果有,那么为假,语句不执行;如果没有值,则为真,执行下面的语句
        echo "No such user or User‘s shell is null."
        exit 10
#直接中断脚本的执行
fi
 
 
if [ "$Shell" =="/bin/bash" ]; then
        echo "Bash User."
        Ret=0
else
        echo "Not Bash User."
        Ret=9
fi
 
exit $Ret

[[email protected]]# bash -x if_shell.sh roott

++ cut -d: -f7
++ grep ‘^roott:‘ /etc/passwd
+ Shell=
+ ‘[‘ -z ‘]‘
+ echo ‘No such user or User‘\‘‘sshell is null.‘
No such user or User‘s shell isnull.
+ exit 10

还是用上面这个例子,但只需要判断用户的shell是否以sh结尾,就采用模式匹配的方式来进行字符串匹配:

[[email protected]]# Shell=/bin/bash

[[email protected]]# [[ “$Shell” =~ sh$ ]]

#采用行尾锚定的方式进行模式匹配,判断变量Shell是否以sh结尾

[[email protected]]# echo $?

0

上述示例改进为判断一个用户的shell是否以sh结尾,是就显示为可登陆用户,否就显示为非登陆用户

[[email protected]]# vim if_shell_sh.sh

#!/bin/bash
#
 
Shell=`grep "^$1:"/etc/passwd | cut -d: -f7`
 
if [ -z $Shell ]; then
        echo "No Shell."
        exit 3
fi
 
if [[ "$Shell" =~ sh$]]; then
        echo "Login User"
        Ret=0
else
        echo "None Login User."
        Re4=4
fi
 
exit $Ret

[[email protected]]# bash -n if_shell_sh.sh

[[email protected]]# bash if_shell_sh.sh root

Login User

[[email protected]]# bash if_shell_sh.sh roott

No Shell.

[[email protected]]# bash -x if_shell_sh.sh daemon

++ cut -d: -f7
++ grep ‘^daemon:‘ /etc/passwd
+ Shell=/sbin/nologin
+ ‘[‘ -z /sbin/nologin ‘]‘
+ [[ /sbin/nologin =~ sh$ ]]
+ echo ‘None Login User.‘
None Login User.
+ Re4=4
+ exit

[[email protected]]# useradd -s /bin/tcsh hello

#创建一个用户,指定其shell为tcsh

[[email protected]]# bash -x if_shell_sh.sh hello

++ cut -d: -f7
++ grep ‘^hello:‘ /etc/passwd
+ Shell=/bin/tcsh
+ ‘[‘ -z /bin/tcsh ‘]‘
+ [[ /bin/tcsh =~ sh$ ]]
+ echo ‘Login User‘
Login User
+ Ret=0
+ exit 0

例2. 写一个脚本:判断当前主机的CPU生产商,其信息在/proc/cpuinfo文件中vendor_id一行中。如果其生产商为GenuineIntel,就显示其为Intel公司;否则,就显示其为AMD公司

可以使用grep命令取出主机的生产商:

[[email protected]]# cat /proc/cpuinfo | grep "vendor_id" | uniq

vendor_id       : GenuineIntel

[[email protected]]# cat /proc/cpuinfo | grep "vendor_id" | uniq | cut -d: -f2

 GenuineIntel
#注意,做模式匹配时需要注意空格

 

此脚本可以写成:

[[email protected]]# vim if_cup.sh

#!/bin/bash
#
Vendor=`grep"vendor_id" /proc/cpuinfo | uniq | cut -d: -f2`
 
if [[ "$Vendor" =~[[:space:]]*GenuineIntel$ ]]; then
        echo "Intel"
else
        echo "AMD"
fi

[[email protected]]# bash -n if_cup.sh

[[email protected]]# bash -x if_cup.sh

++ cut -d: -f2
++ uniq
++ grep vendor_id /proc/cpuinfo
+ Vendor=‘ GenuineIntel‘
+ [[  GenuineIntel =~ [[:space:]]*GenuineIntel$ ]]
+ echo Intel
Intel

例3. 写一个脚本,通过参数传递一个字符串给脚本,如果传递的字符串为“memory”或“Memory”,就以MB为单位显示当前主机的内存信息;否则,就显示/proc/uptime文件的内容

[[email protected]]# vim memory.sh

#!/bin/bash
#
if [[ $1 =~ ^[Mm]emory$ ]]; then
        free -m
else
        cat /proc/uptime
fi

[[email protected]]# bash -n memory.sh

[[email protected]]# bash -x memory.sh memory

+ [[ memory =~ ^[Mm]emory$ ]]
+ free -m
             total       used       free    shared    buffers     cached
Mem:           996        509        487         0         54        160
-/+ buffers/cache:        293        702
Swap:         2015          0       2015

[[email protected]]# bash -x memory.sh Memory

+ [[ Memory =~ ^[Mm]emory$ ]]
+ free -m
             total       used       free    shared    buffers     cached
Mem:           996        509        487        0         54        160
-/+ buffers/cache:        293        702
Swap:         2015         0       2015

[[email protected]]# bash -x memory.sh abc

+ [[ abc =~ ^[Mm]emory$ ]]
+ cat /proc/uptime
47430.02 46732.82

24_Shell语言————if条件判断之字符测试,布布扣,bubuko.com

时间: 2024-10-13 17:28:48

24_Shell语言————if条件判断之字符测试的相关文章

26_Shell语言————if条件判断之文件测试、短路操作符

一.文件测试 文件测试大多都是单目测试,其用法相对简单,其格式为: 操作符:文件路径 可以用来测试的选项有: -f:测试其是否为普通文件,即使用ls -l命令查看时,文件类型显示为 - 的文件: -d:测试其是否为目录文件,即使用ls -l命令查看时,文件类型显示为 d的文件: -e:测试文件是否存在,不论是目录还是文件,如果存在则为真,否则为假: -r:测试文件对当前访问者来说(非创建者)是否可读: -w:测试文件对当前访问者来说(非创建者)是否可写: -x:测试文件对当前访问者来说(非创建者

25_Shell语言————if条件判断之组合判断(与、或、非)和多分支if语句

一.组合条件判断 组合条件测试是指可以将多个条件组合起来进行判断,条件和条件之间有逻辑关系.例如判断一个数是否大于3,并且小于9,这里大于3是一个条件,小于9也是一个条件,这两个条件必须同时满足.同时满足即为逻辑关系.通常逻辑关系有以下几种: 与:-a,当指定多个条件时,默认为与关系 或:-o 非:!,这是个单目操作符 如判断一个UID是否大于1,且小于499的写法如下: [[email protected] tutor]# Uid=300 [[email protected] tutor]#

linux基础之shell编程(2)-条件判断,算数运算,测试

bash中如果实现条件判断? 条件测试类型 整数测试 字符测试 文件测试 条件测试的表达式 有三种 [ expression ] --方括号与表达式之间一定要有一个空格 [[ expression ]] test expression 整数测试 -eq: 测试两个整数是否相等 例:$A -eq $B -ne: 测试两个整数是否不等 不等为真,相等为假 -gt: 测试一个数是否大于另一个数:大于,为真:否则,为假: -lt: 测试一个数是否小于另一个数:小于,为真:否则,为假: -ge: 大于或等

shell中的条件判断if和测试

(一)条件判断 if 中-z 到 -d 的意思 [ -a file ] 若file存在,则为真. [ -b file ] 若file存在且是一个块特殊文件,则为真. [ -c file ] 若file存在且是一个字特殊文件,则为真. [ -d file ] 若file存在且是一个目录,则为真. [ -e file ] 若file存在,则为真. [ -f file ] 若file存在且是一个普通文件,则为真. [ -g file ] 若file存在且已经设置了SGID,则为真. [ -h file

Linux学习笔记--bash脚本编程之二、条件判断

 bash脚本编程之二.条件判断 条件判断: 如果用户不存在 添加用户,给密码并显示添加成功: 否则 显示用户已存在,没有添加 bash中如何实现条件判断? 整数测试 字符测试 文件测试 条件测试的表达式:     [expression]     [[expression]]     test expression 整数比较: -eq:测试两个整数是否相等:比如 $A -eq $B     -ne:测试两个整数是否不等:不等,为真:相等,为假:     -qt:测试一个数是否大于另一个数:大于

shell编程---条件判断

一.shell编程之条件判断 1.整数测试 a.条件测试的表达式 [ expression ] [[ expression ]] test expression b.整数比较 -eq: 测试两个整数是否相等:比如 $A -eq $B -ne: 测试两个整数是否不等:不等,为真:相等,为假: -gt: 测试一个数是否大于另一个数:大于,为真:否则,为假: -lt: 测试一个数是否小于另一个数:小于,为真:否则,为假: -ge: 大于或等于 -le:小于或等于 c.命令的间逻辑关系 逻辑与: &&am

bash脚本编程之(3/4)条件判断、算符运算、整数测试、文件测试、特殊变量等笔记

Shell编程: 编译器,解释器 编程语言: 机器语言.汇编语言.高级语言 静态语言: 编译型语言 强类型(变量) 事先转换成可执行格式 c\c++\JAVA\c# 动态语言: 解释性语言 弱类型 边解释边执行 asp/asp.net/php/shell/python/perl Shell: 弱类型编程语言 强类型: 变量在使用前,必须事先声明,甚至还需要初始: 弱类型: 变量用时声明,甚至不区分类型: 面向过程: Shell C 面向对象: JAVA Python, perl, c++ 变量:

bash脚本编程之条件判断、条件测试

脚本编程: 编程面向过程有如下几种执行方式 顺序执行 选择执行:  如 if, case 循环执行:  如 for, while, until bash的变量类型: 本地变量 set VAR_NAME=value 设置变量赋值 如: set User=Centos unset VAR_NAME 撤消变量赋值 如: unset User=Centos ${VAR_NAME} 作用范围:当前shell进程: 局部变量 local VAR_NAME=value 设置变量赋值 unset VAR_NAM

19.自学Linux之路:bash条件的逻辑运算与bash编程之字符测试

课前复习:求出200以内能被3整除的整除之和 #!/bin/bash declare -i sum=0 for i in {1..200};do if [ $[$i%3] -eq 0 ]; then let sum+=$i fi done echo "The sum is: $sum" bash的知识点: 给条件测试:对条件做逻辑运算 与:条件1 && 条件2 或:条件1 || 条件2 非:!条件 例:#userName=root #id $userName &