文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Bash 初学者系列 7:bash 中的条件语句(if else)

懒人大天才

懒人大天才

2024-04-23 23:39

关注

  今天我们介绍一下如何在 bash 中使用条件语句。

  在 bash 中使用 if 语句

  在绝大多数编程语言中,if 语句都是最基本的条件语句。在 bash 中其语法如下:​

  复制

  1.  if [ condition ]; then your codefi

  if 语句以 fi(与if相反)结束。

  注意空格:

  1.在开始括号之后,与结束括号之前,都必须要有一个空格,否则 shell 将报错;

  2.条件运算符(=,==,<=等)前后必须有空格,否则将报错。

  我们创建一个示例脚本 root.sh,当你以 root 身份运行该脚本的时候,才会进入 if 语句:​

  复制

  1.  #!/bin/bash

  2.  if [ $(whoami) = 'root' ]; thenecho "You are root"fi

  whoami 命令输出当前用户名。在 ​​bash 变量​​​教程中,我们介绍了 $(command) 结构的语法用于命令替换。

  所以,当你以 root 用户身份登录时,条件 $(whoami) = 'root' 才为真。 

  if-else 语句

  上述代码中,如果当前用户不是 root,将看不到任何输出。当 if 条件为 false 的时候,需要将其执行的代码放到 else 语句中,如下所示:

  复制

  1.  #!/bin/bash

  2.  if [ $(whoami) = 'root' ]; thenecho "You are root"elseecho "You are not root"fi

  此时,当你以普通用户运行脚本的时候,会输出 You are not root,如下所示:​

  复制

  1.  $ ./root.shYou are not

  使用 else if 语句

  当有多个表达式(条件)时,可以使用 elif(else-if)语句。看下面的例子,我们创建一个名为 age.sh 的脚本:​

  复制

  1.  #!/bin/bash

  2.  AGE=$1

  3.  if [ $AGE -lt 13 ]; thenecho "You are a kid."elif [ $AGE -lt 20 ]; thenecho "You are a teenager."elif [ $AGE -lt 65 ]; thenecho "You are an adult."elseecho "You are an elder."fi

  上述代码中的 -lt 即小于(less than)。在前面的文章中我们介绍过如何给 ​​bash 脚本传递参数​​​,现在我们运行一下 age.sh,并传递不同的参数:​

  复制

  1.  $You are a kid.$You are a teenager.$You are an adult.$You are an elder.

  需要注意的是,在条件语句中,可以有多个 elif ,但是只能有一个 else,且必须使用 fi 关闭。

  在 bash 中嵌套使用 if 语句

  if 语句可以嵌套使用。看如下 weather.sh 脚本:​

  复制

  1.  #!/bin/bash

  2.  TEMP=$1

  3.  if [ $TEMP -gt 5 ]; thenif [ $TEMP -lt 15 ]; thenecho "The weather is cold."elif [ $TEMP -lt 25 ]; thenecho "The weather is nice."elseecho "The weather is hot."fielseecho "It's freezing outside ..."fi

  上述脚本接受温度作为参数,然后显示一条反应天气情况的信息。当温度大于 5 度的时候,就会进入嵌套的 if 语句。我们运行一下该脚本:​

  复制

  1.  $It's freezing outside ...$The weather is cold.$The weather is nice.$The weather is hot.

  在 bash 中使用 case 语句

  我们还可以在 bash 中使用 case 语句来替换多个 if 语句,其构造的一般语法如下:​

  复制

  1.  case "variable" in"pattern1"Command … ;;"pattern2"Command … ;;"pattern2"Command … ;;esac

  注意:

  1.条件语句最后总会包含一个空格和右括号 );

  2.条件语句后的命令以两个分号 ;; 结束,其前面的空格可有可没有;

  3.case 语句 以 esac 结尾(与 case 相反)。

  case 语句在处理模式匹配或正则表达式的时候特别有用。作为演示,我们创建一个名为 char.sh 的脚本:​

  复制

  1.  #!/bin/bash

  2.  CHAR=$1

  3.  case $CHAR in[a-z])echo "Small Alphabet."[A-Z])echo "Big Alphabet."[0-9])echo "Number."*)echo "Special Character."esac

  上述脚本接受一个字符作为参数,并显示该字符是大写字母,还是小写字母、数字还是特殊字符。​

  复制

  1.  $ ./char.sh aSmall Alphabet.$ ./char.sh ZBig Alphabet.$ ./char.sh 7Number.$ ./char.sh $Special Character.

  上述脚本中我使用了通配符 * 来定义默认字符,它相当于 if 语句中的 else 语句。

  bash 中的测试条件

  有许多测试条件可以与 if 语句一起使用。如果使用数字、字符串或文件,测试条件会有所不同。将它们视为bash中的逻辑运算符。

  下表列出一些最常用的测试条件:

条件 相当于
$a -lt $b $a < $b
$a -gt $b $a > $b
$a -le $b $a <= $b
$a -ge $b $a >= $b
$a -eq $b $a 等于 $b
$a -ne $b $a 不等于 $b
-e $FILE $FILE 存在
-d $FILE $FILE 存在且是一个目录.
-f $FILE $FILE 存在且是一个常规文件.
-L $FILE $FILE 存在且是一个软链接.
$STRING1 = $STRING2 $STRING1 等于 $STRING2
$STRING1 != $STRING2 $STRING1 不等于 $STRING2
-z $STRING1 $STRING1 是空的

  上面这些测试条件不需要专门记,可以在 man 手册中查看:

  复制

  1.  $ man test

  我们创建一个名为 filetype.sh 的脚本,用来检查文件是常规文件、目录还是软链接:​

  复制

  1.  #!/bin/bash

  2.  if [ $# -ne 1 ]; thenecho "Error: Invalid number of arguments"exitfi

  3.  file=$1

  4.  if [ -f $file ]; thenecho "$fileelif [ -L $file ]; thenecho "$fileelif [ -d $file ]; thenecho "$fileelseecho "$filefi

  在脚本的开始,我们检查一下参数的数量,如果没有参数或者有多个参数,脚本会输出一条消息并退出。下面是运行情况:​

  复制

  1.  $ ./filetype.sh weather.shweather.sh is a regular file.$ ./filetype.sh /bin/bin is a soft link.$ ./filetype.sh /var/var$ ./filetype.sh Error: Invalid number of arguments

  在同一行中编写 if else 语句

  到目前为止,我们上述代码都是在规范的缩进格式下写的,这是一种规范的写法,但并不是非这样写不可。

  当你只想在 shell 中看到结果时,可以在单行中使用 if else 语句。

  假设我们有如下脚本:​

  复制

  1.  if [ $(whoami) = 'root' ]; thenecho "You are root"elseecho "You are not root"fi

  可以在一行代码中这样写:

  复制

  1.  if [ $(whoami) = 'root' ]; then echo "root"; else echo "not root"; fi

  大家可以运行一下上面的脚本,看看结果。

  基本上,就是在命令结束后添加分号 ; ,然后写下一条语句。

  来源: TIAP

  >>>>>>点击进入系统运维专题

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     436人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     201人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     163人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     242人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     68人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-运维
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯