zoukankan      html  css  js  c++  java
  • 03 . Shell数组和函数

    Shell数组

    简介

    数组中可以存放多个值。Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似)。

    与大部分编程语言类似,数组元素的下标由0开始。

    Shell 数组用括号来表示,元素用"空格"符号分割开,语法格式如下:

    # array_name=(value1 ... valuen)
    
    实例
    #!/bin/bash
    my_array=(A B "C" D)
    
    # 我们可以使用功能下标来定义数组
    array_name[0]=value0
    array_name[1]=value1
    array_name[2]=value2
    
    读取数组

    读取数组元素值的一般格式是

    # ${array_name[index]}
    
    # Example
    my_array=(A B "C" D)
    
    echo "第一个元素为: ${my_array[0]}"
    echo "第二个元素为: ${my_array[1]}"
    echo "第三个元素为: ${my_array[2]}"
    echo "第四个元素为: ${my_array[3]}"
    
    
    # 执行脚本,输出如下
    chmod +x test.sh 
    ./test.sh
    第一个元素为: A
    第二个元素为: B
    第三个元素为: C
    第四个元素为: D
    
    获取数组中所有元素

    使用功能@或*可以获取数组中所有元素

    #!/bin/bash
    my_array[0]=A
    my_array[1]=B
    my_array[2]=C
    my_array[3]=D
    
    echo "数组的元素为: ${my_array[*]}"
    echo "数组的元素为: ${my_array[@]}"
    
    chmod +x test.sh 
    ./test.sh
    数组的元素为: A B C D
    数组的元素为: A B C D
    
    获取数组的长度

    获取数组长度的方法与获取字符串长度的方法相同,例如

    #!/bin/bash
    my_array[0]=A
    my_array[1]=B
    my_array[2]=C
    my_array[3]=D
    
    echo "数组元素个数为: ${#my_array[*]}"
    echo "数组元素个数为: ${#my_array[@]}"
    
    chmod +x test.sh 
    ./test.sh
    数组元素个数为: 4
    数组元素个数为: 4
    

    Shell函数

    定义一个普通函数

    linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。

    shell中函数的定义格式如下:

    [ function ] funname [()]
    {
        action;
        [return int;]
    }
    
    # 说明:
    # 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
    # 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255
    

    下面例子定义了一个函数进行调用

    #!/bin/bash
    
    demoFun(){
        echo "这是我的第一个 shell 函数!"
    }
    echo "-----函数开始执行-----"
    demoFun
    echo "-----函数执行完毕-----"
    
    # 输出结果
    sh test.sh
    -----函数开始执行-----
    这是我的第一个 shell 函数!
    -----函数执行完毕-----
    
    带return函数
    funWithReturn(){
        echo "这个函数会对输入的两个数字进行相加运算..."
        echo "输入第一个数字: "
        read aNum
        echo "输入第二个数字: "
        read anotherNum
        echo "两个数字分别为 $aNum 和 $anotherNum !"
        return $(($aNum+$anotherNum))
    }
    funWithReturn
    echo "输入的两个数字之和为 $? !"
    
    sh test.sh 
    这个函数会对输入的两个数字进行相加运算...
    输入第一个数字: 
    1
    输入第二个数字: 
    1
    两个数字分别为 1 和 1 !
    输入的两个数字之和为 2 !
    
    # 函数返回值再调用函数后通过$?来获得.
    # 注意: 所有函数在使用前必须定义,这意味着必须将函数放在脚本开始部分,直至shell解释器发现他时才能使用
    # 调用函数仅使用函数名即可
    
    函数参数

    在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...

    带参数的函数示例:

    funWithParam(){
        echo "第一个参数为 $1 !"
        echo "第二个参数为 $2 !"
        echo "第十个参数为 $10 !"
        echo "第十个参数为 ${10} !"
        echo "第十一个参数为 ${11} !"
        echo "参数总数有 $# 个!"
        echo "作为一个字符串输出所有参数 $* !"
    }
    funWithParam 1 2 3 4 5 6 7 8 9 34 73
    
    # 输出结果
    sh test.sh 
    第一个参数为 1 !
    第二个参数为 2 !
    第十个参数为 10 !
    第十个参数为 34 !
    第十一个参数为 73 !
    参数总数有 11 个!
    作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !
    

    注意

    # $10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。
    
    特殊字符
    参数处理 说明
    $# 传递到脚本或函数的参数个数
    $* 以一个单字符串显示所有向脚本传递的参数
    $$ 脚本运行的当前进程ID号
    $! 后台运行的最后一个进程的ID号
    $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
    $- 显示Shell使用的当前选项,与set命令功能相同。
    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
    Shell脚本互相调用

    和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件

    Shell 文件包含的语法格式如下

    . filename   # 注意点号(.)和文件名中间有一空格
    # or
    source filename
    

    实例

    创建两个shell脚本文件

    test1.sh代码如下

    #!/bin/bash
    url="http://www.baidu.com"
    

    test2.sh代码如下

    #!/bin/bash
    
    #使用 . 号来引用test1.sh 文件
    . ./test1.sh
    
    # 或者使用以下包含文件代码
    # source ./test1.sh
    
    echo "官网地址:$url"
    
    # 输出结果
    # sh test2.sh
    # 官网地址:http://www.baidu.com
    # 被包含的文件test1.sh不需要可执行权限
    
  • 相关阅读:
    《你的知识需要管理》——田志刚
    《谁动了我的奶酪》——[美]斯宾塞·约翰逊
    《程序员面试宝典(第三版)》——欧立奇 / 刘洋 / 段韬
    《天才在左疯子在右》——高铭
    LintCode: Combination Sum
    LintCode: Flatten Binary Tree to Linked List
    LintCode: First Position of Target
    LintCode: Delete Node in the Middle of Singly Linked List
    LintCode: Maximum Depth of Binary Tree
    pytorch visdom可视化工具学习—3-命令行操作使用经验
  • 原文地址:https://www.cnblogs.com/you-men/p/13215506.html
Copyright © 2011-2022 走看看