shell 第四篇

79 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

二、函数

函数

  1. ==没有参数列,没有返回值,return返回的是状态码,使用$?查看==

  2. 定义函数:

    function test1()
    {
        #这个return的值,表示这个函数之后之后返回的状态码,而不出返回值,
        #不能通过a=test()来获取100值
        #可以通过echo $?来获取
        return 100
    }
    ​
    #function去掉
    test()
    {
    ​
    }
    #去掉括号 
    function test
    {
    ​
    }
    ​
    #function和()至少保留一个,否则无法识别成函数ss
    
  3. 案例:

    #!/bin/bashfunction test1()
    {
        a=200
        #a=100
            #这个return的值,表示这个函数之后之后返回的状态码,而不出返回值,
            #不能通过a=test()来获取100值
            #可以通过echo $?来获取
        if [ $a -eq 100 ]; then
            return 0
        else
            echo "hello test1"
            return 100
        fi
    }
    #function去掉
    test2()
    {
            echo "hello test2"
    }
    #去掉括号
    function test3
    {
            echo "hello test3"
            #如果函数没有return值,那么最后一条执行命令的状态码,就是这个函数的状态码
    }
    ​
    ​
    #function和()至少保留一个,否则无法识别成函数ss
    ​
    v1=`test1`
    ​
    if [ $? -eq 0 ];then
        echo "test1执行成功! a=100"
    else
        echo "test1执行之后,a!=100"
    fi#echo "test1 的返回状态码:" $?
    #echo "v1 : " "$v1"
    ​
    test2
    test3
    

1585709515511.png

  1. 小结:

    1. 执行状态$?看return的返回值,如果没有返回值,则以最后一条命令的返回值为准

      test2()
      {
          echo "hello test2"
          cp  #echo $? 1
      }
      
    2. return修饰的状态码只能是数字

      function test3
      {
          echo "hello test3"
      ​
          #./functest.sh: line 26: return: beijing: numeric argument required
          return "beijing" #这是错误的用法,必须是数字
      }
      
  2. 函数参数:

    1. 调用方法与命令一样,也是1,1, 2 ..

      test4()
      {
          echo "test4 函数参数为: $1, $2"
      }
      ​
      test4 "hello" "world"
  3. 案例:递归遍历指定目录的文件!

#!/bin/bash#案例:递归遍历指定目录的文件!
#目录由用户通过命令行传入:#./recursive.sh ..recursive()
{
    #接收用户输入的目录
    #currDir="$1"
    local currDir="$1"
    echo "====> 当前目录为:" "$currDir"
​
    #遍历当前目录
    for i in `ls $currDir`
    do
        #这样才是有效的路径,后续才能正确判断性质
        #item="$currDir+"/"+$i"  <<=== 这是错误的,  /usr/+/+test.txt
        item="$currDir/$i"
        #echo "item: " $item
​
        #如果i是文件,则打印
        if [ -f "$item" ]; then
            echo "文件找到: $item"
        elif [ -d "$item" ];then
        #如果i是文件夹,则递归遍历
            echo "文件夹找到:" "$item"
            recursive $item
        else
            echo "未知文件:" "$item"
        fi
    done
}
​
#判读输入参数的个数
if [ $# -ne 1 ];then
    echo "Usage: recursive <文件目录>"
    exit
fi
​
recursive $1

调试

shell调试参数:

  • -n 帮助我们快速检查脚本的语法,而不是逐条执行

    • 脚本如果很大,中间执行过程很长,如果不能实现发现脚本错误,会浪费时间
    • bash -n ./recursive.sh
      

1585713051107.png

  • -x,执行脚本的同时将代码执行过程打印到屏幕,便于追踪

    • bash -x recursive.sh ==》 作用于整个脚本

    • 可以在代码中,对指定的代码段进行调试

      • set -x ==> 启动调试

      • xxxx

      • set +x ==> 停止调试

1585713439412.png

  • -v,一边执行脚本,一边打印错误输出(很少用)

shift 8 ==> *, 快速定位当前光标所值单词(向下寻找,n)

shift 3 ==> #, 快速定位当前光标所值单词(向上寻找,n)