• 【重点】Shell入门教程:流程控制(2)条件判断的写法


    第三节:条件判断的写法

    if条件判断中,if的语法结构中的“条件判断”可以有多种形式。测试结果是真是假,就看其传回的值是否为0。

    条件测试的写法,有以下10种

    1.执行某个命令的结果

     这里的命令,可包括管道命令,例如:命令1 | 命令2 | 命令3,称为 pipeline,其结束状态为最后一个命令执行的结果。

    举例:

    #!/bin/bash
    
    if grep -q "rm" fn.sh; then
    	echo "find in command."
    else
    	echo "not find."
    fi

    行3,在条件测试中,执行命令时:grep -q "rm" fn.sh,它是寻找fn.sh文件里是否有关键词rm。选项-q表示不显示,仅借助$?来传回执行结果。

    2.传回某个命令执行结果的相反值

    其形式为: ! 命令

     注意,! 和 命令之间要有“空格符”隔开。

    如果命令传回值为0,则加上 ! 之后传回值为1;反之,如果命令传回值为非0,则加上 ! 后,传回值为0。

    举例:

    #!/bin/bash
    
    if ! grep -q "rm" fn.sh; then
    	echo "not find."
    else
    	echo "find rm command"
    fi

    3.使用复合命令:((算术))

    如果算式的运算结果不为0,则传回真值(0),否则如果运算结果为0,则传回假值(1)。再举例如下:

    ((算式))运算结果判断真假值
    ((0)) 0
    ((1)) 1
    ((8)) 8
    ((-1)) -1
    ((2-2)) 0
    ((5*6)) 30
    ((20<30)) 数字比较运算为真
    ((20&&30)) 逻辑AND运算为真
    ((20&&0)) 逻辑AND运算为假
    ((0&&1)) 逻辑AND运算为假
    ((10||0)) 逻辑OR运算为真
    ((0||1)) 逻辑OR运算为真
    ((0||0)) 逻辑OR运算为假

    4.使用Bash关键字‘[[’、‘]]’组成的式子:[[ 判断式 ]]

    判读式会传回真假值,传回0为真,非0为假。

    注意:[[ 的后面、]] 的前面,至少要有一个(含)以上的“空格符”才行。

    举例:

    #!/bin/bash
    
    if [[ str > xyz ]]; then
    	echo "字符串str比较大"
    else
    	echo "字符串str比较小"
    fi

    执行结果:显示“字符串str比较小”

    5.使用内置命令:test 判断式

    test是Bash的内置命令,可传回“判断式”的结果,真值传回0,假值传回1。

    举例:

    #!/bin/bash
    
    if test "str" > "xyz"; then
    	echo "字符串str比较大"
    else
    	echo "字符串str比较小"
    fi

    执行结果:显示“字符串str比较小”

    要特别注意的是:大于符号 > 对Bash而言是特殊字符,要用 予以转义,不然,无法得到正确的测试结果。

    6.使用内置命令:[ ]

    格式为:[ 判断式 ]

    [] 和 test 的用法是相同的,两者可改写互换。

    举例:

    #!/bin/bash
    
    if [ "str" > "xyz" ]; then
    	echo "字符串str比较大"
    else
    	echo "字符串str比较小"
    fi

    执行结果:显示“字符串str比较小”

    要特别注意的是:大于符号 > 对Bash而言是特殊字符,一样要用 予以转义。

    此例的第1行,可改写成test的用法

    if test "str" > "xyz"; then

    7.使用 -a、-o 进行逻辑组合:

    注意: -a、-o 是放在 [ ] 里面的!

    举例:

    [ -r filename1 -a -x filename1]

    如果 filename1 可读且可执行,则为真。-o 即 “且”之意。

    [ -r filename1 -o -x filename1]

    如果filename1可读或可执行,则为真。-o即“或”之意。

    8.命令1 && 命令2

    && 称为逻辑的AND,其运作方式是:如果“命令1”执行结果为真,才会执行“命令2”;如果两个皆为真,则传回真值0,否则传回假值1。

    #!/bin/bash
    
    a=20
    if grep -q "rm" fn.sh && [ $a -lt 100 ]; then
    	echo "ok"
    else
    	echo "not ok"
    fi

    && 的特性,经常拿来当做是一种隐形的if语法。例如:

    [ -z "$PS1" ] && return

    代码意思是:先判断 $PS 变量值是否为空,如果是,就执行return命令,由子Shell环境返回到父Shell,这等于是结束执行该Script。等同于以下if语句:

    if [ -z "$PS1" ]; then
    	return;
    fi

    再来看一例:

    [ -f /proc/net/if_inet6 ] && echo '这部主机支持IPv6'

    往后,凡是“[ 判断式 ] && 指令”的形式,就视为一种隐形的 if-then 语法。

    9.命令1 || 命令2

    || 称为逻辑的OR,其运作方式是:如果“命令1”执行结果为假,才会执行“命令2”;如果两个之中有一个为真,则传回真值0,否则传回假值1。

    #!/bin/bash
    
    a=200
    if grep -q "rm" fn.sh || [ $a -lt 100 ]; then
    	echo "ok"
    else
    	echo "not ok"
    fi

    || 的特性,也可当做是一种隐形的if语法。例如:

    prefix="/home"
    defpath="/usr/local/bin"
    [ -z ${prefix:-} ] || prefix=${defpath%/*}

    行3,因 $prefix非空,所以,${prefix:-} 变量扩展的传回值为prefix的变量值(非空),[ -z ${prefix:-} ] 对空值的条件测试失败,其结果为假,根据 || 的特性,会接着执行 prefix=${defpath%/*},它会由 $defpath 后方删去样式 /* 的最短字符串,即删去 /bin,因此,$prefix的值为 /usr/local。

    本例可改写成if语法如下:

    prefix="home"
    defpath="/usr/local/bin"
    if [ ! -z ${prefix:-} ]; then
    	prefix=${defpath%/*}
    fi

    10.&& 和 || 合用

    && 和 || 合用,也可以有 if-then-else 的效果,例如:

    [ -n ${DEBUG:-} ] && set -v || set +v

    这行代码,使用 -n 测试变量DEBUG是否有设非空值,如果有,表示要进行排错,接着执行AND的下一个指令:set -v;如果无,则不进行排错,而执行逻辑OR的下一个指令:set -v,它会把显示程序的功能关闭。

    本例可改写if语法如下:

    if [ -n "$DEBUG" ]; then
    	set -v
    else
    	set +v
    fi

    往后,凡是“[ 判断式 ] && 指令1 || 指令2”的形式,就视为一种隐形的 if-then-else 的语法。

    最后总结:

    在上述这些条件测试的方法中,[[]] 和 test、[] 的意思和用法是相近的,但 [[]] 比 test 和 [] 更自由一点,因为 [[]] 不必担心某些Bash特殊字符对运算符的影响,不必写一堆转义字符的怪字符,如 [[ str < xyz ]] 是正确的语法,但在 [] 中却要写成 [ str < xyz ],这种陷阱很容易忘记,一旦忘了写转义字符,要发现错误所在,就不容易了。在 [[]] 中,<、>、&&、、|| 等都可以自由地使用,不必使用转义字符。

    除了[[]]之外,在Bash中,(())也不必理会上述提到的特殊字符的影响。

    下面,还有一点要特别注意的:

    [[ 判断式 ]] 中,如果使用 == 或 != ,且在这两个运算符右方的字符串没有加上单引号或双引号,则 == 和 != 会视为想要对比该字符串所形成的“样式”,如果相等,传回0,如果不符,传回1。

    举例:

    #!/bin/bash
    
    a="str"
    if [[ $a == ??? ]]; then
    	echo "Match"
    fi

    行4,[[ $a == ??? ]] 的意思是说,用 $a 的值,对比样式 ???3个字符的字符串)。

    但如果把行4改成:

    if [[ $a == "???" ]]; then

    那意思就不同了,此时 == 变成了是判断 $a 和 字符串 ??? 是否相等。

  • 相关阅读:
    Ubuntu Linux 开发者笔记本
    jQuery – 随机排列 item
    MemberwiseClone 关于 string 浅拷贝的一个误解
    在Mac OS X中配置Apache + PHP + MySQL
    ASP.NET MVC 3和Razor中的@helper 语法
    textpattern 在 nginx 上的 rewrite 规则
    错误:无法将带[]的索引应用于ConnectionStringsCollection类型的表达式
    F# 3.0新特性简介
    开发中状态到底用数字还是字符串
    将网站中用户上传的零散小文件存储在MongoDB中的.net解决方案
  • 原文地址:https://www.cnblogs.com/52php/p/5669926.html
Copyright © 2020-2023  润新知