美文网首页程序员
shell脚本学习(三)

shell脚本学习(三)

作者: CholMay | 来源:发表于2017-03-16 21:32 被阅读103次

    目录:

    • printf 命令
    • if...else语句
    • case ... esac 语句
    • for循环
    • while循环
    • until 循环
    • continue、break

    1、printf 命令

    printf 命令用于格式化输出, 是echo命令的增强版。它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同,移植性要比 echo 好。
    如同 echo 命令,printf 命令也可以输出简单的字符串:

    printf "Hello, world\n"
    

    printf 不像 echo 那样会自动换行,必须显式添加换行符(\n)
    printf命令的语法:printf format-string [arguments...]format-string为格式控制字符串,arguments `为参数列表。

    printf 命令不用加括号
    format-string 可以没有引号,但最好加上,单引号双引号均可。
    参数多于格式控制符(%)时,format-string 可以重用,可以将所有参数都转换。
    arguments 使用空格分隔,不用逗号。

    示例:

    #双引号
    printf "%d -- %s\n" 11 "哈哈"
    #单引号和双引号效果一样
    printf '%d -- %s\n' 11 "哈哈"
    #也可以不写引号
    printf %s "哈哈"
    # 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
    printf "%s\n" abc def
    printf "%s and %d \n"
    # 如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0
    printf "'%s , %d\n'" Hello Shell
    

    输出:

    11 -- 哈哈
    11 -- 哈哈
    哈哈abc
    def
     and 0 
    ./test.sh: line 11: printf: Shell: invalid number
    'Hello , 0
    

    注意,根据POSIX标准,浮点格式%e、%E、%f、%g与%G是“不需要被支持”。这是因为awk支持浮点预算,且有它自己的printf语句。这样Shell程序中需要将浮点数值进行格式化的打印时,可使用小型的awk程序实现。然而,内建于bash、ksh93和zsh中的printf命令都支持浮点格式。

    2、if...else语句

    if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell 有三种 if ... else 语句:

    • if ... fi 语句;
    • if ... else ... fi 语句;
    • if ... elif ... else ... fi 语句。
    if ... else 语句

    if ... else 语句的语法:

    if [ expression ]
    then
       Statement(s) to be executed if expression is true
    fi
    

    最后必须以fi来结尾闭合 if,fi就是 if 倒过来拼写,后面也会遇见。
    注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误。
    示例:

    a=10
    b=20
    if [ $a == $b ]
    then
     echo "a、b相等"
    fi
    
    if [ $a != $b ]
    then
    echo "a、b不相等"
    fi
    

    输出

    a、b不相等
    
    if ... else ... fi 语句

    if ... else ... fi语句的语法:

    if [ expression ]
    then
       Statement(s) to be executed if expression is true
    else
       Statement(s) to be executed if expression is not true
    fi
    

    示例:

    a=10
    b=20
    if [ $a == $b ]
    then
     echo "a、b相等"
    else
        echo "a、b不相等"
    fi
    

    输出:

    a、b不相等
    
    if ... elif ... fi 语句

    if ... elif ... fi语句可以对多个条件进行判断,语法为:

    if [ expression 1 ]
    then
       Statement(s) to be executed if expression 1 is true
    elif [ expression 2 ]
    then
       Statement(s) to be executed if expression 2 is true
    elif [ expression 3 ]
    then
       Statement(s) to be executed if expression 3 is true
    else
       Statement(s) to be executed if no expression is true
    fi
    

    示例:

    a=10
    b=20
    if [ $a == $b ]
    then
     echo "a等于b"
    elif [ $a -gt $b ]
    then
        echo "a大于b"
    else
        echo "a小于b"
    fi
    

    输出:

    a小于b
    

    if ... else语句也可以写成一行,如果同一行有多条语句需要分号,以命令的方式来运行:

    a=10
    b=10
    if test $a -eq $b; then echo 'a、b相等!'; fi;
    

    if ... else语句也经常与test命令结合使用,如下所示:

    a=$[2*3]
    b=$[1+5]
    if test $a -eq $b
    then
        echo 'a、b相等!'
    else
        echo 'a、b不等'
    fi;
    

    test 命令用于检查某个条件是否成立,与方括号([ ])类似

    3、case ... esac 语句

    case ... esac与其他语言中的 switch ... case语句类似,是一种多分枝选择结构。
    case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

    case 值 in
    模式1)
        command1
        command2
        command3
        ;;
    模式2)
        command1
        command2
        command3
        ;;
    *)
        command1
        command2
        command3
        ;;
    esac
    

    case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;;; 与其他语言中的 break 类似,意思是跳到整个case语句的最后。

    取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
    示例:

    #!/bin/sh
    echo "请输入数字1~3"
    read inputNum
    case $inputNum in
        1) echo "输入的是1"
        ;;
        2) echo "输入的是2"
        ;;
        3) echo "输入的的3"
        ;;
        *) echo "无效数字"
        ;;
    esac
    

    输出:

    请输入数字1~3
    2
    输入的是2
    

    实例二:

    #!/bin/sh
    option="${1}"
    case ${option} in
        -f) FILE="${2}"
        echo "File name is $FILE"
        ;;
        -d) DIR="${2}"
        echo "Dir name is $DIR"
        ;;
        *)
        echo "`basename ${0}`:usage: [-f file] | [-d directory]"
        exit 1 # Command to come out of the program with status 1
        ;;
    esac
    

    输出:

    Daniels-MacBook-Pro:desktop chenzhichao$ ./test.sh -f fileName
    File name is fileName
    Daniels-MacBook-Pro:desktop chenzhichao$ ./test.sh -d directoryName
    Dir name is directoryName
    

    4、for循环

    for循环一般格式为:

    for 变量 in 列表
    do
        command1
        command2
        ...
        commandN
    done
    

    列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。
    in 列表是可选的,如果不用它,for 循环使用命令行的位置参数。
    示例一:

    for num in 1 2 3 4
    do
        echo "num is $num"
    done
    

    输出

    num is 1
    num is 2
    num is 3
    num is 4
    

    示例二:

    array=(1 2 3 4 5)
    for a in ${array[*]}
    do
        echo ${a}
    done
    

    输出:

    1
    2
    3
    4
    5
    

    实例三:

    #顺序输出字符串中的字符
    for c in 'hello world'
    do
        echo $c
    done
    

    输出:

    hello world
    

    示例四

    #查看当前目录有哪些jpg图片
    currentDir=`pwd`
    for file in ${currentDir}/*.jpg
    do
        echo $file
    done
    

    输出:

    /Users/chenzhichao/desktop/11.jpg
    

    五、while循环

    while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

    while command
    do
       Statement(s) to be executed if command is true
    done
    

    示例:

    num=5
    while [ $num -gt 0 ]
    do
        echo $num
        num=`expr $num - 1`
    done
    

    输出:

    5
    4
    3
    2
    1
    

    实例二:

    echo "同时按ctrl+D结束"
    echo "输入信息:"
    while read message
    do
        echo "信息:$message"
    done
    

    输出:

    同时按ctrl+D结束
    输入信息:
    你好啊,**
    信息:你好啊,**
    

    六、until 循环

    until循环执行一系列命令直至条件为true时停止。until 循环与 while循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until循环更加有用。
    until 循环格式为:

    until command
    do
       Statement(s) to be executed until command is true
    done
    

    command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。
    示例:

    #!/bin/sh
    a=0
    until [ ! $a -lt 5 ]
    do
        echo $a
        a=`expr $a + 1`
    done
    

    输出:

    0
    1
    2
    3
    4
    

    七、continue、break

    在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shell也使用 breakcontinue来跳出循环。

    break命令

    break命令允许跳出所有循环(终止执行后面的所有循环)。
    示例:

    echo "输入数字1~5,输入其他数字不做处理"
    while read num
    do
        if [ $num -gt 0 -a $num -lt 6 ]
        then
            echo "输入的是$num"
        else
            echo "无效字符,退出"
            break
        fi
    done
    

    输出:

    输入数字1~5,输入其他数字不做处理
    1
    输入的是1
    5
    输入的是5
    6
    无效字符,退出
    

    在嵌套循环中,break命令后面还可以跟一个整数,表示跳出第几层循环。例如:

    break n
    

    表示跳出第 n 层循环
    示例

    for var1 in 1 2 3
    do
        for var2 in 0 5
        do
            if [ $var1 -eq 2 -a $var2 -eq 0 ]
            then
                break 2
            else
                echo "$var1 $var2"
            fi
        done
    done
    

    输出:

    1 0
    1 5
    
    continue命令

    continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
    示例:

    for num in 1 2 3 4 5
    do
        if [ $num == 3 ]
        then
            continue
        fi
    echo "num is $num"
    done
    

    输出:

    num is 1
    num is 2
    num is 4
    num is 5
    

    相关文章

      网友评论

        本文标题:shell脚本学习(三)

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