(027) Linux之shell分支if语句

十年运维系列之基础篇 - Linux

作者:曾林

联系:[email protected]

网站:www.jplatformx.com

版权:文章未经同意请勿转载


一、使用if语句

通过shell,我们可以来写出这样的一个使用if语句的shell脚本片段。如下所示:

#!/bin/bash
# test "if" statement

x=5

if [ $x = 5 ]; then
    echo "x equals 5"
else
    echo "x doesn‘t equals 5"
fi

或者可以直接在命令行中输入以上代码(略有简化),如下图所示:

      if语句的语法格式如下:

if commands; then
    commands
[elif commands; then
    commands]
[else
    commands]
if

在这个语法格式中,“command”可以是一组命令。乍看上去可能会有些迷惑。在去除这个迷惑之前,我们必须要先了解一下shell如何判断一个命令的成功与失败。

二、退出状态

  命令(包括我们编写的shell脚本和shell函数)在执行完毕后,会向操作系统发送一个值,称之为“退出状态”。这个值是一个0~255的整数,用来指示命令执行成功还是失败。按照惯例,数值0表示执行成功,其他的数值表示执行失败。shell提供了一个可以用来检测退出状态的参数。这个参数就是$?。如下图所示:

  在这个例子中,我们两次执行了ls命令。第一次,命令执行成功,如果显示参数“$?”的值,可以看到值是0.第二次执行ls命令时,产生了一个错误,再次显示“$?”的值,这次值是2,表示这个命令遇到了一个错误。有些命令使用不同的退出值来诊断错误,而需要命令执行失败时,只是简单地退出并发送数字1.man手册中经常会包括一个标题为“Exit Status”的段落,它描述使用的代码。数字0总是表示执行成功。

  shell提供了2个非常简单的内置命令,它们不做任何事情,除了以一个0或1退出状态来终止执行。“true”命令总是表示执行成功,而“false”命令总是表示执行失败。如下图所示:

  我们可以用这两个命令来查看if语句是如何工作的。if语句真正做的事情是评估命令的成功或失败。

  当在if后面的命令执行成功时,命令echo "it‘s true."会被执行,而当在if后面的命令执行失败时,该命令则不执行。如果在if后面有一系列的命令,那么则根据最后一个命令的执行结果来进行评估。如下图所示:

三、使用test命令

  目前为止,经常和if一起使用的命令是test。test命令会执行各种检查和比较。这个命令有两种等价的形式:

  test expression

  以及更加流行的

  [ expression ]

  这里的expression是一个表达式,其结果是true或false。当这个表达式为true时,test命令会返回一个0退出状态;当表达式为false时,test命令的退出状态为1。

  1. 文件表达式(expression)

  下表中的表达式展示的是有关文件的表达式。这些文件表达式用来评估文件的状态。

文件表达式 成为true的条件
file1 -ef file2 file1和file2拥有相同的信息节点编号(这两个文件通过硬链接指向同一个文件)
file1 -nt file2 file1比file2新
file1 -ot file2 file1比file2旧
-b file file存在并且是一个块(设备)文件
-c file file存在并且是一个字符(设备)文件
-d file file存在并且是一个目录
-e file file存在
-f file file存在并且是一个普通文件
-g file file存在并且设置了组ID
-G file file存在并且属于有效组ID
-k file file存在并且有“粘滞位(sticky bit)属性”
-L file file存在并且是一个符号链接
-O file file存在并且属于有效用户ID
-p file file存在并且是一个命名管道
-r file file存在并且可读(有效用户有可读权限)
-s file file存在并且其长度大于0
-S file file存在并且是一个网络套接字
-t fd fd是一个定向到终端/从终端定向的文件描述符,可以用来确定标准输入/输出/错误是否被重定向
-u file file存在并且设置了setuid位
-w file file存在并且可写(有效用户拥有可写权限)
-x file file存在并且可执行(有效用户拥有执行/搜索权限)

  下面代码展示了一个使用文件表达式的例子:

#!/bin/bash

# test-file: Evaluate the status of a file

FILE=~/.bashrc

if [ -e "$FILE" ]; then
    if [ -f "$FILE" ]; then
        echo "$FILE is a regular file."
    fi
    if [ -d "$FILE" ]; then
        echo "$FILE is a directory."
    fi
    if [ -r "$FILE" ]; then
        echo "$FILE is readable."
    fi
    if [ -w "$FILE" ]; then
        echo "$FILE is writable."
    fi
    if [ -x "$FILE" ]; then
        echo "$FILE is executable/searchable."
    fi
else
    echo "$FILE does not exist"
    exit 1
fi

exit

  关于上面的脚本,需要注意两个有趣的地方。首先,要注意$FILE在表达式内是如何被引用的。尽管引号不是必需的,但是这可以防范参数为空的情况。如果$FILE的参数扩展产生一个空值,将导致一个错误(操作符会被解释为非空的字符串,而不是操作符)。用引号把参数括起来可以确保操作符后面总是跟随一个字符串,即使字符串为空。其次,注意脚本末尾的exit命令。这个exit命令接受一个单独的可选参数,它将称为脚本的退出状态。当不传递参数时,退出状态默认为0。以这种方法使用exit命令,当$FILE扩展为一个不存在的文件名时,可以允许脚本提示失败。这个exit命令出现在脚本的最后一行。这样,当脚本执行到最后时,不管怎么样,默认情况下它将以退出状态0终止。

  类似地,通过在return命令中包含一个整数参数,shell函数可以返回一个退出状态。如果要将上面的脚本转换为一个shell函数,从而能够在一个更大的程序中使用,可以将exit命令替换为return命令,并得到想要的行为。

时间: 2024-08-01 13:57:04

(027) Linux之shell分支if语句的相关文章

Linux Gvim shell case...esac语句

#case ..esac语句:与switch ..case类似,是一种多分支选择结构#case语句匹配一个值或一个模式,如果匹配成功执行相应命令,如果匹配不成功执行*命令#;;与break类似,代表跳到整个case语句的最后#case 值 in#模式1)#    command1#    ;;#模式2)#    command1#    ;;#*)#    command1#    ;;#esac#示例如下: 1 echo 'Input a number between 1 to 4' 2 ec

Linux Gvim shell if...else语句

#if else语句,共分三种:if...fi ; if ...else ...fi ; if ...elif...else...fi#if else fi 语句语法#if [ expression ]#then#    Statement to be executed if expression is true#else#    Statement to be executed if expression is not true#fi#if elif else fi语句语法:哪一个expres

Linux的shell脚本的语句,函数,检测服务,启动脚本的练习

一.if语句 二.case语句 if语句 case语句对比 三.while语句 四.for循环 五.fun函数 五.fun函数 六.check检测mysqld服务脚本的几种方法 七.服务启动脚本 1.httpd服务启动脚本 2.rsyncd的启动脚本 3.nginx的启动脚本 还有一个更为标准的nginx启动脚本

Linux中的shell脚本编程---语句控制

概述: shell脚本的语句控制 □前面提到了过程式编程语言有三种过程: 顺序执行:按照顺序一条一条语句执行: 选择执行:按照条件进行选择执行: 循环执行:按照给定的循环条件进行循环执行. □其中,顺序不需要特定的控制,只需按照语句依次执行即可:选择执行,则需要特定的控制语句(如:if,case)来判断执行:循环执行则需要特定的循环控制控制(如:for,while等). 一.使用read 命令来接受输入 □在bash脚本编程过程当中有时程序需要与用户之间进行交互,如提示用户输入一些参数等,此时,

Linux Bash Shell编程快速入门

BASH 的基本语法 最简单的例子 -- Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1     最简单的例子 -- Hello World! 几乎所有的讲解编程的书给读者的第一个例子都是 Hello World 程序,那么我们今天也就从这个例子出发,来逐步了解 BASH. 用 vi 编辑器编辑一个 hello 文件如下: #!/bin/bash# This is a very simple

Linux Bash Shell入门教程

BASH 的基本语法 最简单的例子 -- Hello World! 关于输入.输出和错误输出 BASH 中对变量的规定(与 C 语言的异同) BASH 中的基本流程控制语法 函数的使用 2.1     最简单的例子 -- Hello World! 几乎所有的讲解编程的书给读者的第一个例子都是 Hello World 程序,那么我们今天也就从这个例子出发,来逐步了解 BASH. 用 vi 编辑器编辑一个 hello 文件如下: #!/bin/bash # This is a very simple

Linux系统——shell脚本

shell脚本编程 作用:通过命令行解析的方式,自动执行设定好的程序或命令代码.(若将脚本挂到定时任务中,就会自动在非工作时间里自动触发执行程序) Shell脚本文件以".sh"结尾 规范的Shell脚本第一行会指出由哪个程序(解释器)来执行脚本中的内容.在linux bash编程中一般为:#!/bin/bash (表示该脚本运用/bin/bash命令进行解析) Shell的输出用echo命令: Python的输出用print命令 执行脚本的方式: 方法一:/bin/sh是bash的软

linux下shell脚本执行方法及exec和source命令

exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell的命令分为两类:外部命令和内部命令.外部命令是通过系统调用或独立的程序实现的,如sed.awk等等.内部命令是由特殊的文件格式(.def)所实现,如cd.history.exec等等. 在说明exe和source的区别之前,先说明一下fork的概念. fork是linux的系统调用,用来创建子进程(child

[shell]shell中if语句的使用

转自:http://lovelace.blog.51cto.com/1028430/1211353 bash中如何实现条件判断?条件测试类型:    整数测试    字符测试    文件测试 一.条件测试的表达式:    [ expression ]  括号两端必须要有空格    [[ expression ]] 括号两端必须要有空格    test expression组合测试条件: -a: and -o: or !:  非 二.整数比较: -eq 测试两个整数是否相等 -ne 测试两个整数是