美文网首页
linux shell 脚本-基础知识(二)

linux shell 脚本-基础知识(二)

作者: 小pb | 来源:发表于2019-12-04 18:53 被阅读0次

    条件测试和判断语句

    在shell 中,用户可以使用测试语句来测试指定的条件表达式的条件的真或者假。当指定的条件为真时,整个条件测试的返回值为0;反之,如果指定的条件为假,则条件测试语句的返回值为非0值。

    条件测试的语法有两种,分别是test和[命令,下面分别来讲解它们的语法:
    1)test
    test 语法如下:

    test expression
    

    参数expression表示需要测试的条件表达式,可以由字符串、整数、文件名,以及各种运算符组成。

    2)[
    test 命令相同,[ 命令的作用也是对后面的条件表达式进行测试,但是为了增加程序的可读性,shell要求在表达式后面追加一个右方括号 ] 来与前面的 [ 命令配对。语法如下:

    [ expression ]
    

    [是命令,expression 是条件表达式。条件表达式和左右方括号之间都必须有一个空格。

    左方括号 [ 是一个shell命令,而非条件表达式的一部分。
    而命令与参数之间必须保留一个空格。
    所以,在上面的语法中,expression与左右括号都需保留一个空格。
    

    字符串测试

    shell中,可以通过5种运算符来对字符串进行操作。

    字符串运算符

    运算符 说明
    string 判断指定的字符串是否为空
    string1 = string2 判断两个字符串是否相等
    string1 != string2 判断两个字符串是否不相等
    -n string 判断字符串是否非空串
    -z string 判断字符串是够为空串

    对于字符串测试应该基本了解,但应注意以下两点:

    • 在给变量赋值的时候,等号"="左右两边一定不要有空格;否则,shell会把空格前面的字符串当作shell命令
    • 在测试运算符"="、"!="、及"-z"等符号的左右两边,一定含有空格

    整数测试

    整数测试的语法形式为:

    [ number1 op number2 ]
    
    运算符 说明
    number1 -eq number2 比较number1 和number2是否相等。如果相等,测试结果为0
    number1 -ne number2 比较number1 和number2是否不相等。如果不相等,测试结果为0
    number1 -gt number2 比较number1是否大于number2。如果大于,测试结果为0
    number1 -lt number2 比较number1是否小于number2。如果小于,测试结果为0
    number1 -ge number2 比较number1 是否大于等于number2。如果大于等于,测试结果为0
    number1 -le number2 比较number1是否小于等于number2。如果小于等于,测试结果为0

    字符串运算符和整数运算符不可以混用。

    [root@VM_16_3_centos base]$ x=12.3 
    [root@VM_16_3_centos base]$ y=12 
    [root@VM_16_3_centos base]$ [ "$x" -gt "$y" ]
    -bash: [: 12.3: integer expression expected
    

    文件测试

    [ op file ]
    
    操 作 符 说明
    -a file 文件是否存在。如果file存在,则结果为0
    -b file 文件是否存在,且为块文件。如果file是一个已经存在的块文件,则结果为0
    -c file 文件是否存在,且为字符文件。如果file是一个已经存在的字符文件,则结果为0
    -d file 文件是否存在,且为目录。如果file是一个已经存在的目录,则结果为0
    -e file 同-a操作符
    -s file 文件的长度是否大于0或者文件为非空文件。如果file是一个非空文件,则结果为0
    -f file 文件存在,且为常规文件。如果file是一个已经存在的常规文件,则结果为0
    -w file 文件是否存在且可写。如果文件按是一个可写文件则结果为0
    −L file 文件是否存在,且为符号链接。如果file是一个已经存在的符号链接,则结果为0
    −u file 文件是否设置suid位。如果file已经设置了suid位,则结果为0
    −r file 文件是否存在且可读。如果文件按是一个可读文件则结果为0
    −x file 文件是否存在且可执行。如果文件按是一个可执行文件则结果为0

    逻辑操作符

    操作符 说明
    !expression 逻辑非,条件表达式expression的值为假,则该操作符的运算结果为真
    expression1 -a expression2 逻辑与,条件表达式expression1和expression2的值都是真时,整个表达式的值才为真
    expression1 −o expression2 逻辑或,条件表达式 expression1或者expression2的值有一个为真时,整个表达式的值就为真

    条件判断语句

    1.使用简单的if语句进行判断

    if expression
    then
        statement
        statement
    fi
    

    例4:通过条件测试判断某些文件的类型

    #!/bin/bash
    
    # 通过条件测试判断/bin/bash 文件是否存在
    if [ -a /bin/bash ]
    then
        echo "/bin/bash exist!"
    fi
    

    结果为

    [root@VM_16_3_centos if_test]$ sh if.sh 
    /bin/bash exist!
    

    例5:使用空命令作为判断条件

    #! /bin/bash
    
    if :; 
    then
        echo "always true"; 
    fi
    

    空命令":"的退出状态永远为0,因此会输出 always true。

    例6:使用&&代替 if 语句进行判断

    #! /bi/bash
    
    test "$whoami" != "root" && (echo you are using a non-privileged account; exit 1)
    

    该判断语句首先对当前用户进行判断,如果当前用户不为root,也即为真则输出后面的说明语句。

    2.使用if else 语句进行流程控制

    if expression 
    then 
        statement1
        statement2
        ..
    else 
        statement3
        statement4
        ..
    fi
    

    3.使用if elif进行多条件判断

    if expression
    then 
        statement1
        statement2
        ..
    elif expression
    then
        statement3
        statement4
        ..
    else
        statement5
        ..
    fi
    

    4.使用exit语句退出程序

    exit status
    

    status参数表示退出状态,该参数是一个整数值,其取值范围为0~255;

    按照惯例,退出状态0意味着脚本成功运行完毕;而非0通常意味着程序执行过程中出现某些错误。
    因此,用户可以用其它的非0值来给父进程传递不同的消息,根据子进程的成功或者失败,父进程采取不同的措施,如果没有参数给语句,那么由exit语句之前的那条语句的执行状态来决定。

    5.多条件判断语句case

    case语句基本语法:

    case variable in
    value1)
        statement1
        statement2
        ..
        statementn;;
    value2)
        statement1
        statement2
        ..
        statementn;;
    ...
    valuen)
        statement1
        statement2
        ..
        statementn;;
    #其它情况
    *)
        statement1
        statement2
        ..
        statementn;;
    #相当于if 结尾fi
    esac
    

    6.利用case语句处理用户输入

    例7:说明case语句的使用方法

    #! /bin/bash
    
    echo "Hit a key, then hit return."
    #读取用户按下的键
    read keypress
    #case语句开始
    case "$keypress" in
        #小写字母
        [[:lower:]])
            echo "Lowercase letter.";;
        [[:upper:]])
            echo "Uppercase letter.";;
        [0-9])
            echo "Digit.";;
        *)
            echo "other letter.";;
    esac
    

    7.运算符

    1.使用expr外部程序
    #!/bin/bash
    
    #注意: 要用反引号括起来
    result=`expr 2 - 100`
    echo "result=${result}"
    result=`expr 2-100`
    echo "result=${result}"
    
    result=`expr \( 2 - 6 \) \* 12`
    echo "result=${result}"
    
    result=`expr (2-6)*12`
    echo "result=${result}"
    

    结果为

    [root@VM_16_3_centos if_test]$ sh expr.sh 
    result=-98
    result=2-100
    result=-48
    expr.sh: command substitution: line 12: syntax error near unexpected token `2-6'
    expr.sh: command substitution: line 12: `expr (2-6)*12'
    result=
    

    使用expr命令时要注意运算符左右两边的空格,同时需要将括号进行转义表示,括号两边也要注意空格

    2.使用$((…))

    例10:演示使用$((…))符号进行算术运算

    #!/bin/bash
    
    result=$(( 3+6 ))
    echo "result= $result"
    
    result=$(( (1-4) * 5 ))
    echo "result= $result"
    
    result= 9
    result= -15
    
    3.使用let命令

    例11:演示使用let命令执行算术运算

    #! /bin/bash
    
    n=10
    let n=n+1
    echo "$n"
    let n=n*10
    echo "$n"
    let n=n**2
    echo "$n"
    
    11
    110
    12100
    
    4.使用位运算符

    例12:演示使用位运算符的方法

    #! /bin/bash
    
    result=$[ 2 << 3 ]
    echo "$result"
    result=$[ 8>> 2 ]
    echo "$result"
    result=$[ 8 & 4 ]
    echo "$result"
    result=$[ ~8 ]
    echo "$result"
    result=$[ 10 ^ 6 ]
    echo "$result"
    

    结果为:

    16
    2
    0
    -9
    12
    

    相关文章

      网友评论

          本文标题:linux shell 脚本-基础知识(二)

          本文链接:https://www.haomeiwen.com/subject/afmlgctx.html