Skip to content

Latest commit

 

History

History
63 lines (48 loc) · 3.27 KB

if…then语句.md

File metadata and controls

63 lines (48 loc) · 3.27 KB

if…then 语句

  • 在 Shell 脚本中,if…then 语句的语法格式与其他语言有相似之处,语句格式如下:

    if 命令                     if 命令 ; then
    then                           语句块
       语句块        或         fi   
    fi                         
    
    • if 后面要跟一个命令,then 和 fi 关键字中的语句块可以是多条命令,如果 if和 then在同一行,注意要在 if 语句后面加分号

    • 需要注意的是其他语言 if 后面跟着的表达式的值只能是 true 或 false。

    • bash 脚本中的 if 不同其他语言,if 后面的命令执行后的退出码为 0 时,执行 then 后面的语句块,当命令执行后的退出码非 0 时,不会执行 then 后面的语句块,跳过 if 语句执行 if 语句后面的命令,而不是像其他语言当 if 后面为 true 时执行,为 false是跳过 if 语句执行后面的语句。

    • 例子:如果切换工作目录成功则输出一句话到控制台

      #!/bin/bash
      # if 后面的命令是切换到一个目录
      if cd /home/hadoop01/bash01
      then
       echo "切换到目录/home/hadoop01/bash01 成功!"
      fi
      
  • 如果 if 后面的命令执行后的退出码是非 0 的其他正整数值,then 后面的语句块将不会被执行,将跳过 then…fi 语句执行后面的命令,如下所示:

    • 例子:如果目录创建成功则输出一句话到控制台,否则不会执行 then 后面的语句块

      #!/bin/bash
      # 判断创建目录 logs 是否成功,如果创建成功将执行 then 后面的语句块
      # 注意:本例中当前目录下 logs 文件已经存在,mkdir 命令不能正确执行
      if mkdir logs ; then
       echo "在当前目录下创建 logs 目录成功!"
      fi
      
      • 控制台显示:

         mkdir: 无法创建目录"logs": 文件已存在
        
      • logs 文件已经存在,所以 mkdir 命令没有正确执行,退出码是非 0 正整数,所以 then 后面的语句块没有执行。

  • if 语句的后面可以跟任何合法的命令语句,命令执行成功退出码为 0,命令执行失败退出码非 0,if 语句就是根据命令的退出码来判断执行的分支

    • 例子:判断当前登录用户是否存在,如果存在显示工作目录下的文件。

        #!/bin/bash
        # 定义变量 user 并赋值用户名为 yarn
        user=yarn
        # 在文件/etc/passwd 中查找当前用户,如果找到会执行 then 后面的语句块
        if grep "$user" /etc/passwd
        then
         echo "当前登录用户:$user "
         cd /home/$user
         ls -l
        fi
      
      • 控制台显示:

        hadoop01:x:500:500:hadoop01:/home/hadoop01:/bin/bash
        当前登录用户:hadoop01
        总用量 36
        drwxrwxr-x. 2 hadoop01 hadoop01 4096 2 月 28 20:51 bash01
        drwxr-xr-x. 2 hadoop01 hadoop01 4096 2 月 24 13:14 公共的
        drwxr-xr-x. 2 hadoop01 hadoop01 4096 2 月 24 13:14 模板
        …
        
        • 如果变量 user 赋值一个不存在的用户名,then 后面的语句将不会被执行。