shell 之 躲不了的函数

4,836 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

经过前几篇文章的学习,慢慢的不可避免的,就要接触到函数.果不其然,在shell之批量操作(二)这篇文章中,我也是第一次使用了函数.更有条理的来完成,我们想要的结果.既然都用到了,那这里就好好的学习一下吧.

您能在这里看到啥

  1. 啥是函数
  2. 函数传参即返回值
  3. 函数变量作用范围
  4. 使用其他文件函数

啥是函数

  1. 自己的理解

    函数其实就是代码重复利用和最小功能集的代码块.区别在于,各个语言定义函数的格式有所不同.这一点我不太确定.所有语言的函数是不是都需要调用才可以执行,如果您知道,可以在评论里告知一下.

  2. shell中的函数

    shell之批量操作(二)这里我们看一下是怎么创建函数

    # 批量移动txt文件
    mvtxt() {
        target="*.txt"
        find "$project_path" -name "$target" -print0 | while IFS= read -r -d '' file; do
            echomsg "$file"
            mv "$file" "$project_demo_path/a"
        done
    }
    mvtxt
    

    从上面的代码里,我们可以看到最简单的函数的雏形.也可以发现,函数里,其实是把本来在函数外面的shell命令.归纳到了函数里.从而我们可以得到结论.

    函数是由shell命令组成的代码块.但是它是可以独立运行的,因为它不是一个单独的进程,必须依赖在shell程序里.得到调用才会执行函数里的代码块.

  3. 函数格式

    • 默认函数格式

      [function] funname [()]
      {
          函数体...
          [return 参数];
      }
      
    • 格式说明:

      1. []包裹的内容,代表是可选的.
      2. 切记如果在funname后面你不使用().就要一定使用function,如下所示
        function test {}
        
    • 函数事例

      • 省事语法
        test(){
          echo "test"
        }
        test(){
            return "test"
        }
        
      • 规范语法
        function test() {
           echo "test"
        }
        
        function test {
           return "test"
        }
        
        

函数传惨即返回值

经过上面的整理,我们也算是初步了解,怎么定义函数.下面我们学习一下,怎么调用函数,以及怎么获取函数返回值

  • 函数调用

    在调用函数的时候,分为两种情况

    • 无参数

      test

    • 有参数

      如果需要多个参数,每个参数之间用空格分隔.如下所示:

      test p1 p2 p3 p4

    如上所示,我们可以得到结论,调用函数只需要写函数名 + 参数 即可.

  • 函数参数

    在上面的举例中.我们知道函数是可以有参数的,那我们在函数里,怎么获取参数

    • 获取所有参数

      可以使用$@来获取函数的所有参数.如下所示:

      test() {
          for var in "$@";do
              echo "$var"
          done
      }
      
      test "1" "2" "3" "4"
      
      输出结果: 1 2 3 4
      
    • 获取单个参数

      可以使用$n来获取第n个参数.如下所示:

        test() {
          echo "$2"
      }
      
      test "1" "2" "3" "4"
      输出结果: 2
      
    • 获取参数个数

      可以使用$#来获取参数的个数.如下所示:

      test() {
          echo "$#"
      }
      
      test "1" "2" "3" "4"
      输出结果: 4
      
  • 函数值

    • 返回字符串
      # 如果只是返回字符串,需要如下使用
      get_test() {
          echo "test"
      }
      # 获取函数返回
      RES=$(get_test)
      echo "$RES"
      # 输出如下所示:
      test
      
    • 返回数值
      function test() {
         return "$1"
      }
      # 获取函数返回
      test 1
      a=$?
      echo "$a"
      # 输出结果
      1
      
    • 返回变量
      # 由于shell默认函数只可以返回`整数值`和`固定字符串`
      # 如果想返回变量,则需要我们定义一个变量来接收函数返回值.
      test() {
         msg="test"
         # 我们定义的变量.承载函数返回值
         result=$msg
      }
      test
      # 取值的时候,直接获取我们定义的变量即可
      echo "$result"
      

函数变量作用范围

shell文件中变量是全局环境.如果你想让变量限定在函数内部有效,需要使用local命令

 test() {
     local a
     a=1
     echo "$a"
 }
 a=10
 test
 echo "$a"
 # 输出结果
 10

使用其他文件函数

在我们的功能不断完善的过程中,不能一直把所有的功能都写在一个sh文件中,这样就需要我们根据功能来创建不同sh文件.这就出现了一个新的的问题,我们应该怎么使用其他sh文件中参数或者定义的函数呢.那就引出了source指令.下面简单说一下source指令

  • source命令
    • source命令称为点命令,是bash的内部命令
    • 功能: 使shell读入指定sh文件,并依次执行文件中的所有语句
    • 用法
      • source ts.sh
      • . ts.sh
  • source使用
    • 引入文件只用一个函数或者文件没有函数,

      当引入的文件没有函数或只有一个函数,就可以直接使用source即可.代码如下所示 创建ts.sh文件

      ts.sh
      echo "ts"
      test() {
        echo "test"
      }
      
      

      创建主体文件

      tes.sh
      source ./ts.sh
      echo "tes"
      test
      
      

      当我们执行tes.sh文件的时候.ts.sh文件就会也被执行.

      输出如下
      ts
      tes
      test
      
    • 引入文件有一个或多个函数

      当引入的文件有多个函数的时候,就需要我们使用chmod a+x指令.来赋予当前脚本可以执行文件中的所有函数.代码如下所示

      创建ts.sh测试文件

      ts.sh
      test1() {}
      test2() {}
      test3(){}
      

      创建tes.sh主体文件

      source ./ts.sh
      chmod a+x ts.sh
      # 这样我们就可以调用所有函数了
      test1
      test2
      test3
      
      

系列文章

学习文章

shell 函数