shell脚本编程测试类型上

一bash的条件测试

判断某需求是否满足,需要由测试机制来实现。专用的测试表达式需要由测试命令辅助完成测试过程。

评估布尔声明,以便用在条件性执行中。若真,则返回0;若假,则返回1。

测试命令:
• test EXPRESSION
• [ EXPRESSION ]
• [[ EXPRESSION ]]和上面两个不同的在于支持正则表达式
注意:EXPRESSION前后必须有空白字符

(一)使用test命令

[[email protected] ~]# type test
test is a shell builtin
[[email protected] ~]# type [
[ is a shell builtin 内部命令
[[email protected] ~]# type [[
[[ is a shell keyword

比较两个字符串是否相同

[[email protected] ~]# srtr1=abc
[[email protected] ~]# srtr2=abc
[[email protected] ~]# test str1=str2
[[email protected] ~]# echo $?
0
[[email protected] ~]# test str1 = str2
[[email protected] ~]# echo $?
1
[[email protected] ~]# srtr1=abc
[[email protected] ~]# srtr2=def
[[email protected] ~]# test str1 = str2
[[email protected] ~]# echo $?
1
[[email protected] ~]# test str1 != str2
[[email protected] ~]# echo $?
0
[[email protected] ~]# test str1 ! = str2 #注意!=一定要连在一起的
-bash: test: too many argumentsy

(二)使用中括号[ ]

系统里面的脚本也是使用中括号。

使用中括号会更好,因为test是字符串,容易和其他的字符串混在一起,而中括号一目了然。

注意使用中括号EXPRESSION前后必须有空白字符

[[email protected] ~]# srtr1=abc
[[email protected] ~]# srtr2=abc
[[email protected] ~]# [test1 = test2]
-bash: [test1: command not found #使用中括号EXPRESSION前后必须有空白字符
[[email protected] ~]# [ test1 = test2 ]

[[email protected] ~]# echo $?
0

系统里面的脚本也是使用中括号

[[email protected] shell_scripts]# cat  /etc/init.d/functions
# -*-Shell-script-*-
#
# functions This file contains functions to be used by most or all
#       shell scripts in the /etc/init.d directory.
#

TEXTDOMAIN=initscripts

# Make sure umask is sane
umask 022

# Set up a default search path.
PATH="/sbin:/usr/sbin:/bin:/usr/bin"
export PATH

if [ $PPID -ne 1 -a -z "$SYSTEMCTL_SKIP_REDIRECT" ] &&         [ -d /run/systemd/system ] ; then
    case "$0" in
    /etc/init.d/*|/etc/rc.d/init.d/*)
        _use_systemctl=1
        ;;
    esac
fi

在中括号里面,只要中括号里面有东西就是为真,没有就是为假

[[email protected] ~]# [ ] && echo true ||  echo false
false
[[email protected] ~]# [ 123 ] && echo true ||  echo false
true
[[email protected] ~]# [ 1243] && echo true ||  echo false
-bash: [: missing `]‘
false
[[email protected] ~]# [1243] && echo true ||  echo false
-bash: [1243]: command not found
false
[[email protected] ~]# [1243 ] && echo true ||  echo false
-bash: [1243: command not found
false

?如果中括号里面是引号,就要空格

[[email protected] ~]# [ "" ] && echo true ||  echo false
false
[[email protected] ~]# [ " " ] && echo true ||  echo false
true

如果变量是有值,但是是空字符串,那么直接写就假,要使用引号引起来

[[email protected] ~]# a=36
[[email protected] ~]# [ $a ] && echo true ||  echo false
true
[[email protected] ~]# unset a
[[email protected] ~]# a=" "
[roo[email protected] ~]# [ $a ] && echo true ||  echo false
false
[[email protected] ~]# [ "$a" ] && echo true ||  echo false
true

可以使用中括号判断某个变量是否赋值了

[[email protected] ~]# [ "x"$a = "x" ] && echo true ||  echo false #这个x纯粹就是为了组合的,x和字符串组合,如果a没有定义,那么x就等于x。这里的x是一个字母代表,使用其他的字母也可以。
true
[[email protected] ~]# a=245
[[email protected] ~]# [ "x"$a = "x" ] && echo true ||  echo false
false

在6里面的vim /etc/rc.sysinit中使用的就是这种方法。

645 # Start up swapping.
646 update_boot_stage RCswap
647 action $"Enabling /etc/fstab swaps: " swapon -a -e
648 if [ "$AUTOSWAP" = "yes" ]; then
649         curswap=$(awk ‘/^\/dev/ { print $1 }‘ /proc/swaps | while read x; do get_numeric_dev dec $x ; echo -n " "; done)
650         swappartitions=$(blkid -t TYPE=swap -o device)
651         if [ x"$swappartitions" != x ]; then
652                 for partition in $swappartitions ; do
653                         [ ! -e $partition ] && continue
654                         majmin=$(get_numeric_dev dec $partition)
655                         echo $curswap | grep -qw "$majmin" || action $"Enabling local swap partitions: " swapon $partition
                                                                                                                                  

二bash的字符串测试

字符串测试操作符的作用包括:比较两个字符串是否相同、测试字符串的长度是否为零、字符串是否为NULL等。

(一)常用字符串测试操作符及其说明:

== 是否等于

> ascii码是否大于ascii码

< 是否小于

!= 是否不等于

=~ 左侧字符串是否能够被右侧的PATTERN所匹配,注意: 此表达式一般用于[[ ]]中;扩展的正则表达式

-z "STRING“ 字符串是否为空,空为真,不空为假。若字符串的长度为0,则为真,即测试表达式成立, z可以理解为zero的缩写"

-n "STRING“ 字符串是否不空,不空为真,空为假。若字符串的长度不为0,则为真,即测试表达式成立, n可以理解为no zero

注意:用于字符串比较时的用到的操作数都应该使用引号

"串1"="串2"   若字符串1等于字符串2,则为真,即测试表达式成立,可使用"==”代替

"串1"!="串2" 若字符串1不等于字符串2,则为真,即测试表达式成立,但不能用"!==”代替"!

(二)字符串测试操作符的注意事项:

对于字符串的测试,一定要将字符串加双引号之后再进行比较。

如[-n  "$var"] ,特别是使用中括号[ ]的场景。

比较符号(例如=和!-)的两端一定要有空格。

"!=”和“=”可用于比较两个字符串是否相同。

注意一般相等或者不等写上一个中括号就可以

[[email protected] ~]# var=abc;[ "$var" != "abc" ]  &&  echo true ||  echo false
false
[[email protected] ~]# var=abc;[ "$var" = "abc" ]  &&  echo true ||  echo false
true

两个中括号

[[email protected] ~]# var=abc;[[ "$var" = "abc" ]]  &&  echo true ||  echo false
true
[[email protected] ~]# var=abc;[[ "$var" != "abc" ]]  &&  echo true ||  echo false
false

两个中括号的优点就是支持正则表达式

=~ 左侧字符串是否能够被右侧的PATTERN所匹配
注意: 此表达式一般用于[[ ]]中;扩展的正则表达式

[[email protected] ~]# var=abcd;[[ "$var" =~ cd ]]   &&  echo true || echo false
true
#只要变量包含了字符串,返回的值就是真

[[email protected] ~]# var=abc;[[ "$var" =~ cd ]]   &&  echo true || echo false
false
[[email protected] ~]# var=abc;[[ "$var" =~ ab?  ]]   &&  echo true || echo false
true
[[email protected] ~]# var=b;[[ "$var" =~ a?  ]]   &&  echo true || echo false
true
[[email protected] ~]# var=b;[[ "$var" =~ b+  ]]   &&  echo true || echo false
true
[[email protected] ~]# var=a;[[ "$var" =~ .  ]]   &&  echo true || echo false
true
[[email protected] ~]# var=a;[[ "$var" =~ ..  ]]   &&  echo true || echo false
false
[[email protected] ~]# var=a;[[ "$var" =~ .  ]]   &&  echo true || echo false #点表示的是包含任意1个字符
true

[[email protected] ~]# var=a;[[ "$var" =~ ..  ]]   &&  echo true || echo false #点表示的是包含任意1个字符,而2个点表示的是包含任意2个字符,而变量的值只有1个字符,所以返回的是假。
false
[[email protected] ~]# var=abc;[[ "$var" =~ ..  ]]   &&  echo true || echo false #点表示的是包含任意1个字符,而2个点表示的是包含任意2个字符,而变量的值是3个字符,所以返回的是真
true
[[email protected] ~]# var=abc;[[ "$var" =~ ^..$  ]]   &&  echo true || echo false#已经锚定了任意2个字符,而变量的值是3个字符,所以返回的是假
false

判断文件名的后缀是否是sh的

正则表达式很绕,要多看

[[email protected] ~]# filename=f1.sh;  [[ "$filename"  =~  .*\.sh$ ]]   && echo true  ||  echo  false
true
[[email protected] ~]# filename=f1.shshsh;  [[ "$filename"  =~  .*\.sh$ ]]   && echo true  ||  echo  false
false
[[email protected] ~]# filename=f1.shshshs;  [[ "$filename"  =~  .*\.sh ]]   && echo true  ||  echo  false
true
[[email protected] ~]# filename=f1.shshshs;  [[ "$filename"  =~  .*\.sh$ ]]   && echo true  ||  echo  false
false
[[email protected] ~]# filename=f1.shshshs;  [[ "$filename"  =~  \.sh$ ]]   && echo true  ||  echo  false
false
[[email protected] ~]# filename=f1.shshsh;  [[ "$filename"  =~  \.sh$ ]]   && echo true  ||  echo  false
false
[[email protected] ~]# filename=f1.sh;  [[ "$filename"  =~  \.sh$ ]]   && echo true  ||  echo  false
true
[[email protected] ~]# filename=f1.sh;  [[ "$filename"  =~  \.sh$ ]]   && echo true  ||  echo  false     #不管后缀前面的是什么,这种写法也可以
true
[[email protected] ~]# filename=f1.sh;  [[ "$filename"  =~  "\.sh$" ]]   && echo true  ||  echo  false     #在正则表达式是不能加引号的
false
[[email protected] ~]# filename=f1.sh;  [ "$filename"  =~  "\.sh$" ]   && echo true  ||  echo  false     #在正则表达式是不能加引号的
-bash: [: =~: binary operator expected
false
[[email protected] ~]# filename=f1.sh;  [ "$filename"  =~  "\.sh$" ]   && echo true  ||  echo  false     #在正则表达式是不能加引号的,单中括号是不支持=~和正则表达式的,
-bash: [: =~: binary operator expected
false
[[email protected] ~]# var="abc*";  [[ "$var" == "abc*" ]]   &&  echo  true  ||  echo false
true
[[email protected] ~]# var="abc*";  [[ "$var" == abc* ]]   &&  echo  true  ||  echo false
true
[[email protected] ~]# #==不支持正则表达式,而是精确匹配,双引号起到了引用的作用,不是引号本身,加不加引号效果一样。
[[email protected] ~]# var="abcdefgh";  [[ "$var" == abc* ]]   &&  echo  true  ||  echo false
true
[[email protected] ~]# #这里的*表示的通配符,表示正则表达式。注意如果是精确匹配==就不要用双中括号了,这样更不容易搞混。

判断IP地址是否是正确的,匹配IP地址

注意要锚定行首行尾

[[email protected] ~]# ip="192.168.36.1";[[  $ip =~    \<(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>    ]]    &&   echo  $ip  is  correct   ||   echo  $ip  is incorrect
192.168.36.1 is incorrect
[[email protected] ~]# ip="192.168.36.1";[[  $ip =~    ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$    ]]    &&   echo  $ip  is  correct   ||   echo  $ip  is incorrect
192.168.36.1 is correct

变量值加不加引号没啥区别

[[email protected] ~]# ip=192.168.36.1;[[  $ip =~    ^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$    ]]   &&   echo  $ip  is  correct   ||   echo  $ip  is incorrect
192.168.36.1 is correct

判断一个变量是否是纯数字

涉及到正则表达式。*表示包括0次,+表示至少一次

[[email protected] ~]# unset var;  [[ "$var" =~  ^[0-9]*$ ]]   &&  echo  true  ||  echo false
true
[[email protected] ~]# unset var;  [[ "$var" =~  ^[0-9]+$ ]]   &&  echo  true  ||  echo false
false
[[email protected] ~]#  var=123456;  [[ "$var" =~  ^[0-9]+$ ]]   &&  echo  true  ||  echo false
true
[[email protected] ~]#  var=a23456;  [[ "$var" =~  ^[0-9]+$ ]]   &&  echo  true  ||  echo false
false
[[email protected] ~]#  var=023456;  [[ "$var" =~  ^[0-9]+$ ]]   &&  echo  true  ||  echo false
true
[[email protected] ~]#  var=023450;  [[ "$var" =~  ^[0-9]+$ ]]   &&  echo  true  ||  echo false
true
[[email protected] ~]#  var=0;  [[ "$var" =~  ^[0-9]+$ ]]   &&  echo  true  ||  echo false
true
[[email protected] ~]#  var=0a;  [[ "$var" =~  ^[0-9]+$ ]]   &&  echo  true  ||  echo false
false

判断是正整数,不括号0

[[email protected] ~]#  var=0;  [[ "$var" =~  ^[1-9][0-9]*$ ]]   &&  echo  true  ||  echo false   #*表示前面的字符重复0次或者任意次
false
[[email protected] ~]#  var=1;  [[ "$var" =~  ^[1-9][0-9]*$ ]]   &&  echo  true  ||  echo false   #*表示前面的字符重复0次或者任意次
true
[[email protected] ~]#  var=123455670;  [[ "$var" =~  ^[1-9][0-9]*$ ]]   &&  echo  true  ||  echo false   #*表示前面的字符重复0次或者任意次
true
[[email protected] ~]#  var=10000002345567;  [[ "$var" =~  ^[1-9][0-9]*$ ]]   &&  echo  true  ||  echo false   #*表示前面的字符重复0次或者任意次
true
[[email protected] ~]#  var=010000002345567;  [[ "$var" =~  ^[1-9][0-9]*$ ]]   &&  echo  true  ||  echo false   #*表示前面的字符重复0次或者任意次
false
[[email protected] ~]#  var=010000002345567;  [[ "$var" =~  ^0*[1-9][0-9]*$ ]]   &&  echo  true  ||  echo false   #*表示前面的字符重复0次或者任意次
true
[[email protected] ~]# #0*表示的0可以没有,也可以出现好几个。[1-9]表示中间必须是1到9,最后的数是重复0到9任意的数0次及以上。
[[email protected] ~]#  var=000000010000002345567;  [[ "$var" =~  ^0*[1-9][0-9]*$ ]]   &&  echo  true  ||  echo false   #*表示前面的字符重复0次或者任意次
true
[[email protected] ~]#  var=0000007;  [[ "$var" =~  ^0*[1-9][0-9]*$ ]]   &&  echo  true  ||  echo false   #*表示前面的字符重复0次或者任意次
true

示例——匹配手机号

注意手机号第二位现在没有1,2,{9}表示重复前面的数字9次

[[email protected] ~]# mobile=12345670000 ;[[ "$mobile" =~ ^1[3456789][0-9]{9}$  ]] && echo true || echo false
false
[[email protected] ~]# mobile=13345670000 ;[[ "$mobile" =~ ^1[3456789][0-9]{9}$  ]] && echo true || echo false
true

原文地址:https://www.cnblogs.com/wang618/p/11037406.html

时间: 2024-10-28 20:22:46

shell脚本编程测试类型上的相关文章

shell脚本编程测试类型下

一bash的数值测试 -v VAR变量VAR是否设置 数值测试:-gt 是否大于greater-ge 是否大于等于-eq 是否等于-ne 是否不等于  not equal-lt 是否小于-le 是否小于等于 -eq是否等于表示变量值是数字,=表示变量值是字符串 [[email protected] ~]# num=10; [[ "$num" -eq 10 ]] && echo true || echo false true [[email protected] ~]#

Shell脚本编程概述(一):算数运算和条件测试

一.shell脚本语言 1.编程语言的分类: (1)根据运行方式 编译运行:源代码 --> 编译器 (编译)--> 程序文件: 解释运行:源代码 --> 运行时启动解释器,由解释器边解释边运行: (2)根据其编程过程中功能的实现是调用库还是调用外部的程序文件: shell脚本编程:利用系统上的命令及编程组件进行编程: 完整编程:利用库或编程组件进行编程: (3)编程模型: 过程式编程语言:以指令为中心来组织代码,数据是服务于代码: 顺序执行.选择执行.循环执行:代表:C,bash 面向对

shell脚本编程之基础篇(二)

shell脚本编程之基础篇(二) ============================================================================== 概述: ============================================================================== 退出状态 ★进程使用退出状态来报告成功或失败 ◆0 代表成功,1-255代表失败 ◆$? 变量保存最近的命令退出状态 (查看:echo $?)

shell脚本编程进阶练习题

这两天学习了shell脚本编程进阶,作为一枚文科生,小编觉得...恩..脚本很烧脑.....,不过小编还是做了些题,稍作总结后,呈给各位看官,内容如下: 一.条件选择if语句 选择执行: 注意:if语句可嵌套 单分支 if 判断条件;then 条件为真的分支代码 fi 双分支 if 判断条件; then 条件为真的分支代码 else 条件为假的分支代码 fi 多分支 if 判断条件1; then 条件为真的分支代码 elif 判断条件2; then 条件为真的分支代码 elif 判断条件3; t

Shell脚本编程基础

什么是Shell 操作系统最外层的程序,shell通过提示符让用户输入,向操作系统解释该输入,然后处理来自操作系统的任何结果输出来,管理用户与操作系统之间的交互. Shell是一个用户跟操作系统之间的一个命令解释器.Shell是用户与Linux操作系统之间沟通的桥梁.用户可以输入命令执行,又可以利用 Shell脚本编程去运行. 为什么要用到shell shell是一个交互式程序,当用户输入一条命令,shell就解释一条,一次只处理一条命令.如果我们一些复杂操作,逐个敲命令工作量就会增大,因此,我

8.11_Linux之bash shell脚本编程入门篇(一)

什么是bash shell脚本编程? 答:Linux里面有多种shell,而CentOS和redhat的默认shell是bash shell.至于shell脚本,这个跟windows操作系统里面的批处理文件有点像(.bat的文件).不知道大家还是否记得Linux的哲学思想吗?其中有那么两点点:由众多目的的单一应用程序组成:一个程序只做一件事,且做好:组合目的的单一的小程序完成复杂的任务.我觉得shell脚本编程就很好的体现了这个哲学思想.shell脚本利用shell的功能缩写的一个"程序&quo

Linux中的shell脚本编程——基础篇

概述: shell脚本在Linux系统管理员的运维工作中非常重要.shell脚本能够帮助我们很方便的管理服务器,因为我们可以指定一个任务计划,定时的去执行某一个脚本以满足我们的需求.本篇将从编程基础.脚本基本格式.变量.运算.条件测试这几个方面详细介绍shell脚本编程的基础内容,也是我们必须要掌握熟练的内容. 一.编程环境 1.程序:指令+数据 程序编程的风格有两种: 过程式:以指令为中心,数据服务与指令 对象式:以数据为中心,指令服务于数据 2.程序的执行方式: □计算机:只能识别二进制文件

Shell脚本编程及示例和例题解析

Shell脚本的说明: shell脚本编程,实际上就是用vim编辑器编辑一个以.sh为结尾的脚本文件,在此脚本文件中使用Linux内部的一个或多个命令,通过编程语言以脚本运行的方式,一次性运行一次一个.一次多个或多次多个命令进行运算,并输出结果,及添加直观的注释. Shell脚本的编辑标准格式: 使用vim编辑器编辑一个自定义创建的文件名并以.sh格式结尾->    #!/bin/bash    #    脚本主体  \\脚本主体可直接编辑输入参数.命令.函数.shell编程语言等.且脚本主体所

Bash Shell脚本编程笔记总结(一)

本文是上课笔记总结,涉及细节知识点会在以后文章说明! bash脚本编程: 脚本程序:解释器解释执行: shell: 交互式接口:编程环境: shell: 能够提供一些内部命令,并且能通过PATH环境变量找到外部命令:把命令提交给内核启动为进程: 编程环境: 流程控制语句: 顺序执行: 循环执行: 选择执行: 条件测试:真.假 $? 命令的状态结果: 0: 真 1-255: 假 过程式的编程语言的元素:变量.流程.函数.数组 变量:局部变量.本地变量.环境变量.位置参数变量.特殊变量 变量: 数值