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

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 
posted @   墨香清梦  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤
点击右上角即可分享
微信分享提示