shell中if-then的高级使用

 更新时间:2024年11月01日 09:35:38   作者:静听山水  
在Shell脚本编程中,if-then语句是基本的逻辑控制结构,用于根据条件执行代码,本文介绍了if-then的基本语法、条件表达式、使用单双括号的区别及高级特性,感兴趣的可以了解一下

在 Shell 脚本中,if-then 语句是最基本的逻辑控制结构之一,用于根据条件执行不同的代码块。以下是关于 if-then 语句的基本结构、语法以及一些示例。

基本语法

if 条件表达式; then
    # 当条件表达式为真时执行的命令
    命令1
    命令2
    ...
else
    # 当条件表达式为假时执行的命令
    命令A
    命令B
    ...
fi

详细解释

  • if 关键字

    • if 关键字开始一个条件判断。
  • 条件表达式

    • 条件表达式可以是关系表达式、逻辑表达式或其他任何形式的布尔表达式。
    • 条件表达式通常放在圆括号 () 中,以提高可读性和避免解析错误。
  • then 关键字

    • then 关键字表示条件表达式之后的代码块开始。
  • 命令块

    • 当条件表达式为真时,执行 then 后面的命令块。
  • else 关键字(可选)

    • else 关键字表示当条件表达式为假时执行的代码块。
    • else 块是可选的,如果不需要处理条件为假的情况,可以省略。
  • fi 关键字

    • fi 关键字结束整个 if 语句。

示例

示例 1:基本用法

#!/bin/bash

# 获取用户输入
read -p "请输入一个数字: " num

# 判断数字是否大于10
if [ "$num" -gt 10 ]; then
    echo "数字大于10"
else
    echo "数字小于或等于10"
fi

示例 2:使用逻辑运算符

#!/bin/bash

# 获取用户输入
read -p "请输入一个数字: " num

# 判断数字是否在1到10之间
if [ "$num" -ge 1 ] && [ "$num" -le 10 ]; then
    echo "数字在1到10之间"
else
    echo "数字不在1到10之间"
fi

示例 3:嵌套 if-then 语句

#!/bin/bash

# 获取用户输入
read -p "请输入一个数字: " num

# 判断数字是否为正数、负数还是零
if [ "$num" -gt 0 ]; then
    echo "数字是正数"
elif [ "$num" -lt 0 ]; then
    echo "数字是负数"
else
    echo "数字是零"
fi

条件表达式

1. 数值比较

# 比较数值
[ "$num" -eq 10 ]       # 等于
[ "$num" -ne 10 ]       # 不等于
[ "$num" -gt 10 ]       # 大于
[ "$num" -lt 10 ]       # 小于
[ "$num" -ge 10 ]       # 大于或等于
[ "$num" -le 10 ]       # 小于或等于

2. 字符串比较

# 比较字符串
[ "$str" = "hello" ]    # 等于
[ "$str" != "hello" ]   # 不等于
[ "$str" \< "hello" ]   # 字典序小于
[ "$str" \> "hello" ]   # 字典序大于

3. 文件测试

# 测试文件属性
[ -f "$file" ]          # 是普通文件
[ -d "$file" ]          # 是目录
[ -r "$file" ]          # 可读
[ -w "$file" ]          # 可写
[ -x "$file" ]          # 可执行
[ -s "$file" ]          # 文件非空

示例 4:文件测试

#!/bin/bash

# 获取用户输入的文件名
read -p "请输入一个文件名: " filename

# 测试文件是否存在且为普通文件
if [ -f "$filename" ]; then
    echo "文件存在且为普通文件"
else
    echo "文件不存在或不是普通文件"
fi

bash shell还提供了3个可在if-then语句中使用的高级特性。

  • 在子shell中执行命令的单括号。
  • 用于数学表达式的双括号。
  • 用于高级字符串处理功能的双方括号。

接下来将详细描述各个特性。

使用单括号

单括号允许在if语句中使用子shell。单括号形式的test命令格式如下:

(command)

在bash shell执行command之前,会先创建一个子shell,然后在其中执行命令。如果命令成功结束,则退出状态码会被设为0,then部分的命令就会被执行。如果命令的退出状态码不为0,则不执行then部分的命令。来看一个使用子shell进行测试的例子:

$ cat SingleParentheses.sh
#!/bin/bash
# Testing a single parentheses condition
#
echo $BASH_SUBSHELL
#
if (echo $BASH_SUBSHELL)
then
    echo "The subshell command operated successfully."
#
else
    echo "The subshell command was NOT successful."
#
fi
$
$ ./SinglePArentheses.sh
01
The subshell command operated successfully.

当脚本第一次(在if语句之前)执行echo $BASH_SUBSHELL命令时,是在当前shell中完成的。该命令会输出0,表明没有使用子shell。在if语句内,脚本在子shell中执行echo $BASH_SUBSHELL命令,该命令会输出1,表明使用了子shell。子shell操作成功结束,接下来是执行then部分的命令。

警告        当你在if test语句中使用进程列表时,可能会出现意料之外的结果。哪怕进程列表中除最后一个命令之外的其他命令全都失败,子shell仍会将退出状态码设为0,then部分的命令将得以执行。 

 对脚本略作修改,来看一个在子shell中执行失败的例子:

$ cat SingleParentheses.sh
#!/bin/bash
# Testing a single parentheses condition
#
echo $BASH_SUBSHELL
#
if (cat /etc/PASSWORD)
then
    echo "The subshell command operated successfully."
#
else
    echo "The subshell command was NOT successful."
#
fi
$
$ ./SinglePArentheses.sh
cat: /etc/PASSWORD: NO such file or directory
The subshell command was NOT successful.

因为子shell中的命令指定了错误的文件名,所以退出状态码被设为非0。接下来则执行else部分的命令。

使用双括号 

双括号命令允许在比较过程中使用高级数学表达式。test命令在进行比较的时候只能使用简单的算术操作。双括号命令提供了更多的数学符号,这些符号对有过其他编程语言经验的程序员而言并不陌生。双括号命令的格式如下:

((expression))

expression可以是任意的数学赋值或比较表达式。除了test命令使用的标准数学运算符,表还列出了双括号中可用的其他运算符。

双括号命令符号

符号描述
val++后增
val--后减
++val先增
--val先减
!逻辑求反
~位求反
**幂运算
<<左位移
>>右位移
&位布尔AND
|位布尔OR
&&

逻辑AND

||逻辑OR

双括号命令既可以在if语句中使用,也可以在脚本中的普通命令里用来赋值:

$ cat DoubleParentheses.sh
#!/bin/bash
# Testing a double parentheses command
#
val1=10
#
if (( $val1 ** 2 > 90 ))
then
    (( val2 = $val1 ** 2 ))
    echo "The square of $val1 is $val2,"
    echo "which is greater than 90."
#
fi
$
$ ./DoubleParentheses.sh
The square of 10 is 100,
which is greater than 90.

注意,双括号中表达式的大于号不用转义。这是双括号命令又一个优越性的体现。

使用双方括号 

双方括号命令提供了针对字符串比较的高级特性。双方括号的格式如下:

[[ expression ]]

expression可以使用test命令中的标准字符串比较。除此之外,它还提供了test命令所不具备的另一个特性——模式匹配。

注意        双方括号在bash shell中运行良好。不过要小心,不是所有的shell都支持双方括号。

在进行模式匹配时,可以定义通配符或正则表达式来匹配字符串:

$ cat DoubleBrackets.sh
#!/bin/bash
# Using double brackets for pattern matching
#
#
if [[ $BASH_VERSION == 5.* ]]
then
    echo "You are using the Bash Shell version 5 series."
fi
$
$ ./DoubleBrackets.sh
You are using the Bash Shell version 5 series.

上述脚本中使用了双等号(==)。双等号会将右侧的字符串(5.*)视为一个模式并应用模式匹配规则。双方括号命令会对$BASH_VERSION环境变量进行匹配,看是否以字符串5.起始。如果是,则测试通过,shell会执行then部分的命令。 

总结

if-then 语句是 Shell 脚本中最基本的逻辑控制结构之一,用于根据条件执行不同的代码块。通过组合不同的条件表达式和逻辑运算符,可以实现复杂的逻辑判断。

到此这篇关于shell中if-then的高级使用的文章就介绍到这了,更多相关shell if-then内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Shell脚本实现的猜数字小游戏

    Shell脚本实现的猜数字小游戏

    这篇文章主要介绍了Shell脚本实现的猜数字小游戏,本文的猜数字规则相对一般规则的猜数字可能难度要大不少,需要的朋友可以参考下
    2014-12-12
  • shell字符串匹配的实现

    shell字符串匹配的实现

    这篇文章主要介绍了shell字符串匹配的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Shell脚本中获取命令运行结果的实现

    Shell脚本中获取命令运行结果的实现

    本文主要介绍了Shell脚本中获取命令运行结果的实现,除了我们熟知的管道 | 和args,我们也可以通过获取命令的运行结果,本文就来介绍一下,感兴趣的可以了解一下
    2023-10-10
  • Shell全局变量、局部变量与特殊变量的具体使用

    Shell全局变量、局部变量与特殊变量的具体使用

    本文主要介绍了Shell全局变量、局部变量与特殊变量的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Linux脚本自动打包发服务

    Linux脚本自动打包发服务

    这篇文章主要介绍了Linux脚本自动打包发服务的相关资料,需要的朋友可以参考下
    2019-11-11
  • Linux查看端口占用lsof -i:port的方法

    Linux查看端口占用lsof -i:port的方法

    下面小编就为大家带来一篇Linux查看端口占用lsof -i:port的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Shell中变量作用域的介绍与使用命令

    Shell中变量作用域的介绍与使用命令

    作用域是我们在日常学习或者工作中经常会遇到的一个问题,下面这篇文章主要给大家介绍了关于Shell中变量作用域的相关资料,文中介绍的非常详细,需要的朋友可以参考借鉴,下面跟着小编来一起学习学习吧。
    2017-08-08
  • linux下监视进程 崩溃挂掉后自动重启的shell脚本

    linux下监视进程 崩溃挂掉后自动重启的shell脚本

    如何保证服务一直运行?如何保证即使服务挂掉了也能自动重启?在写服务程序时经常会碰到这样的问题。在Linux系统中,强大的shell就可以很灵活的处理这样的事务
    2013-06-06
  • 如何解决 shell 脚本重复执行的问题

    如何解决 shell 脚本重复执行的问题

    假如执行备份脚本消耗的时间远大于设置的备份间隔的话,系统会出现多个同时在执行脚本的Bash实例,会占用大量的系统资源,进而影响正常业务程序的运行,那如何解决上述shell脚本重复执行的问题呢,本文将要介绍的 flock 命令可以解决这个问题
    2021-05-05
  • csh,tcsh,bash,sh等shell的区别

    csh,tcsh,bash,sh等shell的区别

    这篇文章主要介绍了linux下csh, tcsh,bash, sh等shell的区别?,需要的朋友可以参考下
    2014-02-02

最新评论