Bash if..else 语句

2023-11-12

本教程将引导您了解 Bash 的基础知识if声明并向您展示如何在 shell 脚本中使用它。

决策是计算机编程最基本的概念之一。与任何其他编程语言一样,if, if..else, if..elif..else,并嵌套ifBash 中的语句用于根据特定条件执行代码。

if陈述#

Bash if条件句可以有不同的形式。最基本的if声明采用以下形式:

if TEST-COMMAND
then
  STATEMENTS
fi

The if声明以if关键字后跟条件表达式和then关键词。该声明以fi关键词。

If the TEST-COMMAND评估为True, the STATEMENTS被处决。如果TEST-COMMAND回报False, 什么都没发生;这STATEMENTS被忽视。

一般来说,缩进代码并用空行分隔代码块是一个很好的做法。大多数人选择使用 4 空格或 2 空格缩进。缩进和空行使您的代码更具可读性和组织性。

让我们看一下以下示例脚本,该脚本检查给定数字是否大于 10:

#!/bin/bash

echo -n "Enter a number: "
read VAR

if [[ $VAR -gt 10 ]]
then
  echo "The variable is greater than 10."
fi

将代码保存在文件中并从命令行运行它:

bash test.sh

该脚本将提示您输入一个数字。例如,如果您输入 15,则test命令将评估为true因为 15 大于 10,并且echo里面的命令then条款将被执行。

The variable is greater than 10.

if..else陈述#

狂欢if..else声明采用以下形式:

if TEST-COMMAND
then
  STATEMENTS1
else
  STATEMENTS2
fi

If the TEST-COMMAND评估为True, the STATEMENTS1将被执行。否则,如果TEST-COMMAND回报False, the STATEMENTS2将被执行。你只能拥有一个else声明中的条款。

让我们添加一个else前面示例脚本的子句:

#!/bin/bash

echo -n "Enter a number: "
read VAR

if [[ $VAR -gt 10 ]]
then
  echo "The variable is greater than 10."
else
  echo "The variable is equal or less than 10."
fi

如果运行代码并输入数字,脚本将根据数字是否大于或小于/等于 10 打印不同的消息。

if..elif..else陈述#

狂欢if..elif..else声明采用以下形式:

if TEST-COMMAND1
then
  STATEMENTS1
elif TEST-COMMAND2
then
  STATEMENTS2
else
  STATEMENTS3
fi

If the TEST-COMMAND1评估为True, the STATEMENTS1将被执行。如果TEST-COMMAND2评估为True, the STATEMENTS2将被执行。如果没有一个测试命令评估为True, the STATEMENTS2被执行。

您可以拥有一个或多个elif声明中的条款。这else子句是可选的。

按顺序评估条件。一旦条件返回True,其余条件不执行,程序控制移至末尾if声明。

让我们添加一个elif前一个脚本的子句:

#!/bin/bash

echo -n "Enter a number: "
read VAR

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

Nested if声明#

Bash 允许你嵌套if内的陈述if声明。您可以放置​​多个if另一个里面的语句if陈述。

以下脚本将提示您输入三个数字并打印三个数字中最大的数字。

#!/bin/bash

echo -n "Enter the first number: "
read VAR1
echo -n "Enter the second number: "
read VAR2
echo -n "Enter the third number: "
read VAR3

if [[ $VAR1 -ge $VAR2 ]]
then
  if [[ $VAR1 -ge $VAR3 ]]
  then
    echo "$VAR1 is the largest number."
  else
    echo "$VAR3 is the largest number."
  fi
else
  if [[ $VAR2 -ge $VAR3 ]]
  then
    echo "$VAR2 is the largest number."
  else
    echo "$VAR3 is the largest number."
  fi
fi

输出如下所示:

Enter the first number: 4
Enter the second number: 7
Enter the third number: 2
7 is the largest number.
一般来说,使用案例陈述而不是嵌套if声明。

多种条件#

逻辑性OR and AND运算符允许您在中使用多个条件if声明。

这是脚本的另一个版本,用于打印三个数字中最大的数字。在此版本中,而不是嵌套if陈述,我们使用逻辑AND (&&) 操作员。

#!/bin/bash

echo -n "Enter the first number: "
read VAR1
echo -n "Enter the second number: "
read VAR2
echo -n "Enter the third number: "
read VAR3

if [[ $VAR1 -ge $VAR2 ]] && [[ $VAR1 -ge $VAR3 ]]
then
  echo "$VAR1 is the largest number."
elif [[ $VAR2 -ge $VAR1 ]] && [[ $VAR2 -ge $VAR3 ]]
then
  echo "$VAR2 is the largest number."
else
  echo "$VAR3 is the largest number."
fi

测试操作员#

在 Bash 中,test命令采用以下语法形式之一:

test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]

为了使脚本可移植,最好使用旧的测试[命令,可在所有 POSIX shell 上使用。全新升级版test命令[[(双括号)在使用 Bash、Zsh 和 Ksh 作为默认 shell 的大多数现代系统上受支持。

要否定测试表达式,请使用逻辑NOT (!) 操作员。什么时候比较字符串,始终使用单引号或双引号以避免分词和通配符问题。

以下是一些最常用的运算符:

  • -n VAR- 如果长度为 TrueVAR大于零。
  • -z VAR- 正确,如果VAR是空的。
  • STRING1 = STRING2- 如果为真STRING1 and STRING2是平等的。
  • STRING1 != STRING2- 如果为真STRING1 and STRING2不相等。
  • INTEGER1 -eq INTEGER2- 如果为真INTEGER1 and INTEGER2是平等的。
  • INTEGER1 -gt INTEGER2- 如果为真INTEGER1大于INTEGER2.
  • INTEGER1 -lt INTEGER2- 如果为真INTEGER1小于INTEGER2.
  • INTEGER1 -ge INTEGER2- 如果为真INTEGER1等于或大于 INTEGER2。
  • INTEGER1 -le INTEGER2- 如果为真INTEGER1等于或小于INTEGER2.
  • -h FILE- 正确,如果FILE存在并且是一个符号链接。
  • -r FILE- 正确,如果FILE存在并且可读。
  • -w FILE- 正确,如果FILE存在并且可写。
  • -x FILE- 正确,如果FILE存在并且可执行。
  • -d FILE- 正确,如果FILE存在并且是一个目录。
  • -e FILE- 正确,如果FILE存在并且是一个文件,无论类型如何(节点、目录、套接字等)。
  • -f FILE - True 如果文件存在并且是一个常规文件(不是目录或设备)。

结论#

The if, if..else and if..elif..else语句允许您通过评估给定条件来控制 Bash 脚本的执行流程。

如果您有任何问题或反馈,请随时发表评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash if..else 语句 的相关文章

  • 如何在 Unix 控制台或 Mac 终端中编译和运行 C/C++ 代码?

    如何在 Unix 控制台或 Mac 终端中编译 运行 C 或 C 代码 如果是一个简单的单源程序 make foo 源文件在哪里foo c foo cpp等等 你甚至不需要 makefile Make 有足够的内置规则将源文件构建为同名的可
  • 大括号语法 ${var%.*} 是什么意思?

    我正在查看一些旧代码并遇到了以下语法 extractDir downloadFileName tmp 我发现搜索的唯一信息是指命令列表 但这只是一个变量 这个大括号语法在 bash 中意味着什么 在这种背景下 它是一个参数替换 http w
  • 从 shell 查找不包含特定注释的 XML 文件

    我想搜索 awk grep sed 几个 XML 文件 pom xml 文件 跳过某些文件夹 而且 第一个条件是它们必须包含标签
  • Gulp BrowserSync 在终端中显示“重新加载浏览器”,但没有重新加载实际的浏览器。

    我遇到一个问题 我的任务正在按需要运行 并且 BrowserSync 似乎正在工作 但实际的浏览器没有重新加载 我在终端中收到正确的消息 表明一切都按计划进行 我正在为我的本地服务器使用 MAMP 该服务器正在为 WordPress 构建提
  • 如何使用 Bash 编写二进制文件?

    我的问题是我需要创建一个包含以下确切字节的文件 48 00 49 00 我不能使用C perl 其他脚本语言 目标是嵌入式设备 我使用 awk 尝试过 在桌面上它确实有效 awk BEGIN printf c c c c 48 00 49
  • 如何并行执行4个shell脚本,我不能使用GNU并行?

    我有4个shell脚本dog sh bird sh cow sh和fox sh 每个文件使用 xargs 并行执行 4 个 wget 来派生一个单独的进程 现在我希望这些脚本本身能够并行执行 由于某些我不知道的可移植性原因 我无法使用 GN
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • 将 JSON 导出到环境变量

    如果我有这样的 JSON hello1 world1 testk testv 我想将每个键值对导出为环境变量 如何通过 shell 脚本来做到这一点 例如 当我在终端上写时 echo hello1 world1应该打印其他键值对吗 注意 上
  • 关键字“if”如何测试一个值是真还是假?

    在 bash 脚本中 if 1 then echo Yes else echo No fi Output Yes 它表示 1 被视为真值 但在代码中 word Linux letter nuxi if echo word grep q le
  • awk 在循环中使用时不打印任何内容[重复]

    这个问题在这里已经有答案了 我有一堆使用 file 1 a 1 txt 格式的文件 如下所示 A 1 B 2 C 3 D 4 并使用以下命令添加包含每个文件名称的新列 awk print FILENAME NF t 0 file 1 a 1
  • 获取最新远程提交的 SHA1 [重复]

    这个问题在这里已经有答案了 可能的重复 git bash 如何检查是否有新的提交可用 https stackoverflow com questions 6006759 git bash how to check if theres a n
  • SSH,运行进程然后忽略输出

    我有一个命令可以使用 SSH 并在 SSH 后运行脚本 该脚本运行一个二进制文件 脚本完成后 我可以输入任意键 本地终端将恢复到正常状态 但是 由于该进程仍在我通过 SSH 连接的计算机中运行 因此任何时候它都会登录到stdout我在本地终
  • Bash:递归复制命名文件,保留文件夹结构

    我希望 cp R src prog js images icon jpg tmp package 将在目标目录中产生对称结构 tmp package src prog js images icon jpg 但相反 这两个文件都被复制到 tm
  • 使用 SIGINT 默认处理程序时从 system() 返回值

    我遇到了一些奇怪的返回值system 当子进程从终端接收到 SIGINT 时 解释一下 从 Perl 脚本parent pl I used system 运行另一个 Perl 脚本作为子进程 但我还需要通过 shell 运行子进程 所以我使
  • 如何从shell脚本自动登录MySQL?

    我有一个 MySQL 服务器 其中有一个用户和密码 我想在 shell 脚本中执行一些 SQL 查询而不指定密码 如下所示 config sh MYSQL ROOT root MYSQL PASS password mysql sh sou
  • 在 .gitconfig 中隐藏 GitHub 令牌

    我想将所有点文件存储在 GitHub 上 包括 gitconfig 这需要我将 GitHub 令牌隐藏在 gitconfig 中 为此 我有一个 gitconfig hidden token 文件 这是我打算编辑并放在隐藏令牌的 git 下
  • 如何使用bash脚本获取分区的偏移量?

    我可以用parted找出我的图像的偏移量 sudo parted s image img unit B print Model file Disk home user image img 107374182400B Sector size
  • 从 ttyUSB0 写入和读取,无法得到响应

    我对 Linux tty 不太有经验 我的环境是带有丰富 USB 串行的 Raspbian 什么有效 stty F dev ttyUSB0 38400 cu l dev ttyUSB0 s 38400 cu to dev ttyUSB0作品
  • 将多个 csv 文件连接成具有相同标头的单个 csv

    我目前正在使用以下代码导入 6 000 个 csv 文件 带标题 并将它们导出到单个 csv 文件 带单个标题行 import csv files from folder path r data US market merged data
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat

随机推荐

  • 如何在 Debian 9 上安装 Apache Maven

    Apache Maven 是一个开源项目管理和理解工具 主要用于 Java 项目 Maven 使用项目对象模型 POM 它本质上是一个 XML 文件 其中包含有关项目 配置详细信息 项目依赖项等的信息 在本教程中 我们将向您展示在 Debi
  • 使用 SSH 配置文件

    如果您经常通过 SSH 连接到多个远程系统 您会发现记住所有远程 IP 地址 不同的用户名 非标准端口和各种命令行选项即使不是不可能 也是很困难的 一种选择是创建 bash 别名对于每个远程服务器连接 然而 对于这个问题还有另一种更好 更直
  • 如何在 Ubuntu 20.04 上更改主机名

    主机名是在操作系统安装期间设置的 或者是在创建虚拟机时动态分配给虚拟机的 本指南介绍了如何在 Ubuntu 20 04 上设置或更改主机名 而无需重新启动系统 了解主机名 主机名是标识网络上设备的标签 同一网络上不应有两台或更多台具有相同主
  • 如何在Ubuntu上卸载软件包

    有时 您可能会在 Ubuntu 上安装一个应用程序 但在尝试后 您会发现该应用程序不适合您 在这种情况下 您可能需要卸载该软件包 在本文中 我们将向您展示如何使用图形化的 Ubuntu 软件中心 以及通过命令行 使用apt or apt g
  • 如何在 Ubuntu 20.04 上安装和使用 Curl

    curl是一个命令行实用程序 用于从远程服务器传输数据或向远程服务器传输数据 和curl 您可以使用支持的协议之一下载或上传数据 包括 HTTP HTTPS SCP SFTP and FTP 本文介绍了如何安装Curl在 Ubuntu 20
  • 如何使用 Linux 屏幕

    您是否曾经遇到过这样的情况 您在远程计算机上执行长时间运行的任务 突然连接断开 SSH 会话终止 您的工作丢失 好吧 我们所有人都曾在某个时刻发生过这种事 不是吗 幸运的是 有一个实用程序叫做screen这使我们能够恢复会议 介绍 Scre
  • 如何在 Ubuntu Linux 中更改 root 密码

    root 用户 或超级用户 是所有 Linux 和类 Unix 系统上都存在的特殊用户帐户 它可以完全访问系统上的每个命令和任何资源 没有任何限制 如果您从其他 Linux 发行版转到 Ubuntu 您可能想知道默认 root 密码是什么或
  • 如何在 CentOS 8 上安装 Pip

    Pip 是一个包管理系统 允许您安装 删除以及以其他方式管理用 Python 编写的软件包 它可用于从 Python 包索引 PyPI 和其他索引安装包 在本教程中 我们将解释如何在 CentOS 8 上安装适用于 Python 2 和 3
  • 如何在 Vim / Vi 中保存文件并退出编辑器

    对于许多在命令行上花费大量时间的用户来说 Vim 是首选的文本编辑器 与其他编辑器不同 Vim 有多种操作模式 这对于新用户来说可能有点吓人 Vim 或其前身 Vi 预装在 macOS 和几乎所有 Linux 发行版上 当您遇到您最喜欢的编
  • 如何创建和选择 MySQL 数据库

    MySQL是最流行的开源关系数据库管理系统 本教程介绍如何通过命令行创建 MySQL 或 MariaDB 数据库 在你开始之前 我们假设您的系统上已经安装了 MySQL 或 MariaDB 服务器 所有命令均以管理用户身份执行 最小特权创建
  • 如何提取(解压缩)Tar Bz2 文件

    The tar命令允许您创建和提取 tar 档案 它支持多种压缩程序 例如 gzip bzip2 lzip lzma lzop xz 和 compress Bzip2 是最流行的 tar 文件压缩算法之一 按照约定 压缩后的 tar 存档的
  • 如何检查 Linux 中的内存使用情况

    在对系统或应用程序速度缓慢或行为不当进行故障排除时 首先要检查的事情之一是系统内存使用情况 本文介绍如何使用几个不同的命令检查 Linux 中的 RAM 使用情况 free命令 free是检查Linux系统内存使用情况最常用的命令 它显示有
  • 在 CentOS 8 上使用 Let's Encrypt 保护 Apache

    Let s Encrypt 是由互联网安全研究小组 ISRG 开发的免费 自动化 开放的证书颁发机构 提供免费的 SSL 证书 Let s Encrypt 颁发的证书受到所有主要浏览器的信任 并且自颁发之日起 90 天内有效 本教程介绍如何
  • 如何在 Debian 9 上安装 WildFly (JBoss)

    WildFly 以前称为 JBoss 是一个用 Java 编写的跨平台开源应用程序运行时 可帮助您构建令人惊叹的应用程序 WildFly 灵活 轻量 并且基于可根据需要添加或删除的可插拔子系统 在本教程中 我们将引导您完成在 Debian
  • 如何在 Ubuntu 18.04 上安装 Git

    Git 是分布式版本控制系统事实上的标准 现在被大多数开发人员使用 它允许您跟踪代码更改 恢复到之前的阶段 创建分支以及与其他开发人员协作 Git 最初是由莱纳斯 托瓦尔兹Linux内核的创建者 本教程将指导您完成在 Ubuntu 18 0
  • 在 CentOS 7 上安装 Magento 2

    Magento 是一个领先的企业级电子商务平台 基于开源技术构建 将强大的功能与灵活性和用户友好的界面相结合 凭借引人入胜的购物体验 灵活的模块化架构以及企业级可扩展性和性能等功能 Magento 是大多数在线商家的首选平台 这是该系列的第
  • 如何在 CentOS 7 上安装 R

    R 是一种快速发展的开源编程语言和免费环境 专门从事统计计算和图形表示 它由 R 统计计算基金会支持 主要供统计学家和数据挖掘人员用于开发统计软件和执行数据分析 本教程将教你如何在CentOS 7上安装R以及如何从官方安装R包综合 R 档案
  • 如何在 Ubuntu 20.04 上安装 Yarn

    Yarn 是一个与 npm 兼容的 JavaScript 包管理器 可帮助您自动执行安装 更新 配置和删除 npm 包的过程 它缓存每个下载包并通过并行操作加快安装过程 在本教程中 我们将解释如何安装Yarn在 Ubuntu 20 04 上
  • 如何在 Debian 9 上安装 MongoDB

    MongoDB 是一个免费的开源文档数据库 它属于 NoSQL 数据库家族 与 MySQL 和 PostgreSQL 等传统的基于表的 SQL 数据库不同 在 MongoDB 中 数据存储在灵活的 类似 JSON字段可能因文档而异的文档 它
  • Bash if..else 语句

    本教程将引导您了解 Bash 的基础知识if声明并向您展示如何在 shell 脚本中使用它 决策是计算机编程最基本的概念之一 与任何其他编程语言一样 if if else if elif else 并嵌套ifBash 中的语句用于根据特定条