首页 > 其他分享 >条件测试语句和if流程控制语句的使用

条件测试语句和if流程控制语句的使用

时间:2024-01-24 13:49:01浏览次数:28  
标签:语句 10 read 流程 number echo 测试 var fi

1、read命令

read 是一个在Unix/Linux shell中用于从用户输入读取数据的命令。它允许您在脚本中接收用户的键盘输入,并将输入存储到变量中,以便后续处理。以下是一些 read 命令的示例用法:

  1. 读取用户输入:

    echo "What's your name?"
    read name
    echo "Hello, $name!"

    在这个例子中,read name 会等待用户输入,并将输入存储到名为 name 的变量中。然后,脚本会输出欢迎消息,包括用户输入的名字。

  2. 读取多个值:

    echo "Enter your age and city:"
    read age city
    echo "You are $age years old and live in $city."

    在这个例子中,read age city 会等待用户输入两个值,分别存储到 agecity 变量中。

  3. 设置提示符:

    read -p "Enter a number: " number
    echo "You entered: $number"

    使用 -p 选项可以设置一个提示符,让用户知道他们需要输入什么类型的数据。

  4. 隐藏输入:

    read -s -p "Enter your password: " password
    echo "Password entered."

    使用 -s 选项可以隐藏用户的输入,适用于输入密码等敏感信息。

  5. 超时处理:

    read -t 5 -p "Enter something (5 seconds timeout): " input
    if [ -z "$input" ]; then
    #-z "$input" 表示检查变量 $input 是否为空,如果为空则返回真(即条件成立),否则返回假(条件不成立)。
        echo "Timeout!"
    else
        echo "You entered: $input"
    fi

使用 -t 选项可以设置超时时间,如果用户在指定时间内没有输入,脚本会做相应处理。

6.读取的输入分割成数组

input="apple banana cherry"
IFS=" " read -ra fruits <<< "$input"

read 命令通常用于与用户进行交互,接收输入并执行相应的操作。它是编写交互式脚本的重要工具。

2、if 流程控制语句

在Unix/Linux shell中,if 是一种流程控制语句,用于根据条件执行不同的代码块。以下是 if 语句的一般语法:

if [ condition ]; then
    # Code to be executed if the condition is true
fi

image-20230831102842272

if [ condition ]; then
    # Code to be executed if the condition is true
else
    # Code to be executed if the condition is false
fi

image-20230831103655893

if [ condition ]; then
    # Code to be executed if the condition is true
elif
	# Code to be executed if the condition is true
else
    # Code to be executed if the condition is false
fi

image-20230831103826512

 

其中,关键要点如下:

  • if 后面紧跟一个条件测试,通常使用方括号 [ ... ]test 命令来执行条件判断。条件的结果要么为真(非零),要么为假(零)。

  • then 关键字标志着条件成立时要执行的代码块的开始。

  • else 关键字标志着条件不成立时要执行的代码块的开始。

  • fi 表示 if 语句的结束。

以下是一个使用 if 语句的示例:

#!/bin/bash

read -p "Enter a number: " number

if [ "$number" -gt 10 ]; then
    echo "The number is greater than 10."
else
    echo "The number is not greater than 10."
fi

在这个示例中,用户输入一个数字,然后根据输入的数字大小执行不同的代码块。

此外,还可以使用 elif 关键字来添加更多的条件分支,构建更复杂的条件逻辑:

#!/bin/bash

read -p "Enter a number: " number

if [ "$number" -gt 10 ]; then
    echo "The number is greater than 10."
elif [ "$number" -eq 10 ]; then
    echo "The number is equal to 10."
else
    echo "The number is less than 10."
fi

这允许您根据不同的情况执行不同的代码块。总之,if 语句是在shell脚本中实现条件控制流的重要工具。

3、test命令

test 命令通常用于条件测试,它判断给定的条件是否成立,并根据条件的真假返回相应的退出码。在许多 Unix-like 操作系统中,test 命令也可以使用方括号 [ ] 来表示,因为方括号实际上是 test 命令的一个别名。

以下是一些常用的 test 命令和参数:

  1. 数值比较

    • -eq:等于(equal)

    • -ne:不等于(not equal)

    • -gt:大于(greater than)

    • -lt:小于(less than)

    • -ge:大于等于(greater than or equal to)

    • -le:小于等于(less than or equal to)

  2. 字符串比较

    • =:等于(equal)

    • !=:不等于(not equal)

    • -z:长度为零(空字符串)

    • -n:长度非零(非空字符串)

  3. 文件检查

    • -e:文件或目录存在(存在)

    • -f:普通文件存在(存在且是普通文件)

    • -d:目录存在(存在且是目录)

    • -r:可读(有读取权限)

    • -w:可写(有写入权限)

    • -x:可执行(有执行权限)

    • -b:块文件(存在)

    • -c:字符型特殊文件(存在)

  4. 逻辑操作

    • !:逻辑非(取反)

    • -a:逻辑与(and)

    • -o:逻辑或(or)

    比较选项 描述 示例
    -eq 相等(整数比较) if [ "$a" -eq "$b" ]
    -ne 不相等(整数比较) if [ "$a" -ne "$b" ]
    -gt 大于(整数比较) if [ "$a" -gt "$b" ]
    -lt 小于(整数比较) if [ "$a" -lt "$b" ]
    -ge 大于等于(整数比较) if [ "$a" -ge "$b" ]
    -le 小于等于(整数比较) if [ "$a" -le "$b" ]
    = 字符串相等比较 if [ "$str1" = "$str2" ]
    != 字符串不相等比较 if [ "$str1" != "$str2" ]
    -z 字符串为空(长度为0)比较 if [ -z "$str" ]
    -n 字符串非空(长度大于0)比较 if [ -n "$str" ]
    -e 文件存在比较 if [ -e "$file" ]
    -f 文件为常规文件比较 if [ -f "$file" ]
    -d 文件为目录比较 if [ -d "$dir" ]
    -r 文件可读比较 if [ -r "$file" ]
    -w 文件可写比较 if [ -w "$file" ]
    -x 文件可执行比较 if [ -x "$file" ]

下面是一些示例用法:

# 数值比较
if [ $num -eq 10 ]; then
    echo "num 等于 10"
fi

# 字符串比较
if [ "$str" = "hello" ]; then
    echo "str 等于 hello"
fi

# 文件检查
if [ -e /path/to/file ]; then
    echo "文件存在"
fi

# 逻辑操作
if [ $num -lt 5 -o "$str" = "world" ]; then
    echo "num 小于 5 或者 str 等于 world"
fi

这只是 test 命令的一些常见用法示例。你可以在终端中输入 man test 或者 help test 以获取更详细的文档和用法说明。

 

例:判断用户在系统中是否存在,是否有家目录

#!/bin/bash
read -p "input your name: " NAME

if grep "$NAME" /etc/passwd; then 
# grep 命令中,如果用户输入的 $NAME 包含特殊字符,可能会导致 grep 命令解释问题。为了避免这个问题,应该将变量 $NAME 放在双引号中,以确保输入的字符串被正确解释。
    echo "The user $NAME exists on this system."
elif [ -d "/home/$NAME" ]; then  #[ -d "/home/$NAME" ] 实际上是在调用一个名为 test 的命令,其中 -d 是一个参数,用于检查目录是否存在。
    echo "The user $NAME does not exist on this system."
    echo "The user $NAME has a home directory."
else
    echo "The user $NAME does not exist on this system."
    echo "The user $NAME does not have a home directory."
fi

例:数字比较大小

  1 #!/bin/bash
  2 if  [ $1 -eq $2 ];then
  3         echo "it's ok"
  4 else
  5         echo "it's error"
  6 fi

例:字符比较大小

  1 #!/bin/bash
  2 VAR1=test
  3 VAR2=Test
  4 if [ $VAR1 \> $VAR2 ];then
  5         echo "$VAR1 > $VAR2"
  6 else
  7         echo "$VAR1 < $VAR2"
  8 fi

例:清空日志

  1 #!/bin/bash
  2 # clear /var/log/messages
  3 # 确定当前是root用户
  4 if [ $USER != "root" ];then
  5         echo "你必须使用root用户才能执行脚本"
  6         exit 10
  7 fi
  8 
  9 # 判断文件是否存在
 10 if [ ! -f /var/log/messages ];then
 11         echo "文件不存在"
 12         exit 12
 13 fi
 14 
 15 # 保留最近100行日志
 16 tail -100 /var/log/messages > /var/log/mesg.tmp
 17 
 18 # 日志清理
 19 > /var/log/messages
 20 mv /var/log/mesg.tmp /var/log/messages
 21 echo "logs clean up"

[[]][]区别

[[]][] 都是用于条件测试的语法,但它们之间有一些区别。它们分别是 Bash 中的不同条件判断语法。以下是它们的区别:

  1. [ ](方括号):方括号是传统的条件测试语法,在 Bash 中也称为 test 命令的等效写法。方括号内的条件表达式用于测试条件是否为真,并返回退出码来表示测试的结果。需要注意的是,方括号内的条件表达式和运算符之间需要有空格来分隔。例如:

    if [ "$var" -eq 10 ]; then
        echo "var is equal to 10"
    fi

    这里,-eq 是数值相等的比较运算符。

  2. [[ ]](双方括号):双方括号是 Bash 的扩展条件测试语法。它提供了更丰富的条件判断功能,支持更多的逻辑和字符串操作,还可以省略变量的引号。在双方括号中,不需要在运算符两侧使用空格。例如:

    if [[ $var -eq 10 ]]; then
        echo "var is equal to 10"
    fi

    注意,双方括号内的变量不需要引号。而且,双方括号支持更多的逻辑操作,如 &&||

相比之下,[[ ]] 的语法更加强大和灵活,通常在 Bash 脚本中更常用,特别是当需要进行复杂的条件判断时。但需要注意的是,[[ ]] 是 Bash 的扩展语法,可能不在所有的 POSIX 兼容的 shell 中都受支持。在 CentOS 8 中,默认情况下,Bash 是默认的 shell,因此 [[ ]] 是可用的。

通配符

通配符 说明 示例
* 匹配零个或多个字符 *.txt 匹配所有 .txt 文件
? 匹配一个字符 file?.txt 匹配 file1.txt
[] 匹配指定字符集中的任意一个字符 [abc] 匹配 abc
[!...][^...] 匹配不在指定字符集中的任意字符 [^0-9] 匹配任何非数字字符
{} 创建字符串的组合,逗号分隔 {file1,file2}.txt 匹配两个文件
\ 用于转义通配符字符,使其作为普通字符 \* 匹配实际的 * 字符

例:/etc目录的备份

  1 #!/bin/bash
  2 baknamefile=$(date +%F)
  3 bakdir=/root/etcbak
  4 srcdir=/etc
  5 [ -e $bakdir ] ||mkdir $bakdir
  6 tar -zcf $bakdir/$baknamefile-etc.tar.gz $srcdir
  7 echo "====================="
  8 ls -lh $bakdir/$baknamefile-etc.tar.gz
  9 echo "backup is ok "

&&||

在Unix/Linux shell中,&&|| 是逻辑操作符,用于执行命令的条件组合。它们被用于控制命令的执行流程,允许根据前一个命令的成功或失败状态来决定是否执行下一个命令。以下是它们的用法:

  1. 逻辑与 &&

    • command1 && command2: 如果 command1 执行成功(返回退出码为0),则执行 command2

    示例:

    、mkdir myfolder && cd myfolder

    这将首先创建名为 myfolder 的文件夹,如果成功创建,则切换到该文件夹。

  2. 逻辑或 ||

    • command1 || command2: 如果 command1 执行失败(返回退出码非零),则执行 command2

    示例:

    rm non_existent_file || echo "File does not exist."

    这将尝试删除一个不存在的文件,如果删除失败,则输出 "File does not exist."。

这些逻辑操作符可以用于构建更复杂的命令组合。例如,您可以在脚本中使用它们来处理错误情况,避免执行不必要的操作,以及根据条件选择性地执行命令。

请注意,&&|| 都是短路操作符,这意味着如果前一个命令的结果已经能够决定最终结果,后续的命令将不会被执行。

4、实战shell脚本

例:查看服务状态

  1 #!/bin/bash
  2 if [ $# -ge 1 ]; then
  3     systemctl status $1 > /dev/null
  4     if [ $? == 0 ]; then
  5         echo "$1 服务正在运行"
  6     else
  7         systemctl start $1
  8         if [ $? == 0 ]; then
  9             echo "$1 服务已成功启动"
 10         else
 11             echo "无法启动 $1 服务"
 12         fi
 13     fi
 14 else
 15     echo "执行脚本的格式"
 16     echo "sh $0 服务名"
 17 fi

例:日志清理

  1 #!/bin/bash
  2 # clear /var/log/messages
  3 # 确定当前是root用户
  4 if [ $USER != "root" ];then
  5         echo "你必须使用root用户才能执行脚本"
  6         exit 10
  7 fi
  8 
  9 # 判断文件是否存在
 10 if [ ! -f /var/log/messages ];then
 11         echo "文件不存在"
 12         exit 12
 13 fi
 14 
 15 # 保留最近100行日志
 16 tail -100 /var/log/messages > /var/log/mesg.tmp
 17 
 18 # 日志清理
 19 > /var/log/messages
 20 mv /var/log/mesg.tmp /var/log/messages
 21 echo "logs clean up"

例:etc备份

1 #!/bin/bash
  2 baknamefile=$(date +%F)
  3 bakdir=/root/etcbak
  4 srcdir=/etc
  5 [ -e $bakdir ] ||mkdir $bakdir
  6 tar -zcvf $bakdir/$baknamefile-etc.tar.gz $srcdir
  7 echo "====================="
  8 ls -lh $bakdir/$baknamefile-etc.tar.gz
  9 echo "backup is ok "
 10 

标签:语句,10,read,流程,number,echo,测试,var,fi
From: https://www.cnblogs.com/kcloveworld/p/17984478

相关文章

  • 整机性能和2D性能测试 Unixbeach
    一.工具介绍前言UnixBench是一款开源的测试unix系统基本性能的工具,是比较通用的测试VPS性能的工具,会测试系统各个方面一系列的性能,然后将每个测试结果和一个基准值进行比较,得到一个索引值,所有测试项目的索引值结合在一起形成一个测试分数值,也支持多CPU系统的测试,默认的行......
  • MarkDown基础及表格、KaTeX公式、矩阵、流程图、UML图、甘特图语法
    概述最多可设置6级标题技巧列表有序列表MD语法:1.你好2.我也好呈现效果:你好我也好无序列表MD语法:-a-b*aa*bb+aaa+bbb效果:abaabbaaabbb结论,支持三种方式:-、*、+TODO列表MD语法:-[x]后端接口开发-[]与前端联调呈现效果:后端......
  • C# Switch 语句进阶:模式匹配详解与实例演示
     在C#中,switch语句的模式匹配在C#7.0及以上版本中引入。以下是switch语句中常见的模式及其使用方法的示例:1.类型模式:优点: 用于检查对象的运行时类型,使代码更具可读性。publicstaticstringGetObjectType(objectobj){switch(obj){caseinti:......
  • centos下jmeter做性能测试
    windows下jmeter做性能测试,保存会生成一个察看结果树.jmx——这个jmx就是你写的性能脚本,比如你设置的接口地址、参数、用例csv文件,用例路径,cpu.jtl(linux服务器上cpu、内存等监控信息)路径等在centos下做性能测试时,将jmx、数据用例.csv或.txt迁移到linux服务器下,比如放在/usr/local......
  • MFC 简单的界面切换测试主窗体类似控件的方式嵌入其他窗体
    ▲类向导->MFC类创建两个子窗体。1。创建两个子窗体。2。属性设置:1)、“Style”选择“Child”;中文版“样式”选择“下层”。2)、“Border”为“None”;中文版“边框”选择“无”。3。主窗体中实例子窗体对象:声明:private:CSubForm1*m_CSubForm1;CSubForm2*m_CSu......
  • postman 接口测试工具常见用法
    postman不适合做压力测试工具postman接口测试工具,并不适合做压力测试,实际上即便把循环间隔设置为0,postman的请求频率依旧不高,postman是等待接口响应完成以后再发送下一个请求,所以postman是测不到并发问题的,jmeter可以做到异步请求,请求发的飞快,有并发测试要求或者需要比较强的压......
  • WHEN NOT MATCHED THEN语句在oracle中的用法
    WHENNOTMATCHEDTHEN这是一个在某些数据库系统(如Oracle)中使用的特殊子句,用于处理左连接中的"未匹配"情况。当左连接的条件不满足时,这部分的代码会执行。在这种情况下,如果O.DCSHYBH的值在L中没有匹配项,那么将插入一个NULL值或默认值。总的来说,这段代码执行了一个左连接操作,并根......
  • 单元测试中如何Mock HttpContext
    最近团队有小伙伴问在单元测试中如何MockHttpContext.这是一个好问题,整理了一个实现方案分享给大家。在C#中,尤其是在单元测试场景下,模拟(Mocking)HttpContext是一种常见的做法。这允许我们在没有实际HTTP请求的情况下测试与HTTP上下文相关的代码。为了模拟HttpContext,我们通常......
  • Java流程控制
    Java流程控制1、用户交互Scanner之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner是Java5的新特性,我们可以通过Scanner类来获取用户的输入。基本语法Scanners=newScanner(System.in)......
  • 软件测试常用的英文词汇。
    一、专业名词篇A:AutomatedTest自动化测试AlphaTesta测试AcceptanceTest验收测试AgileTesting敏捷测试AccuracyTesting准确性测试B:Black-BoxTest黑盒测试BenchmarkTest基准测试BetaTestβ测试BranchTesting分支测试C:CompatibilityTest兼......