• Linux Shell编程学习笔记(二)函数


    这次我们回顾一下函数的定义,在此之前,如我们学习结构化编程一样,任何语言都脱离不了某种范式,我们先从这些范式入手。首先是条件判断。

    具体的结构是:

    if condition;

    then command;

    elif  condition;

    then commands;

    else

        command;

    fi

    condition的编写可以通过test命令或者是[]算子。比如test $m -eq 0 或者是[ $m -eq 0 ]

    接着是迭代:迭代的集合类数据以逗号或者是空格分割

    data="data1 data2"

    迭代的for语句是

    for item in $data

    do

        statements;

    done;

    在data中默认的分隔符号受IFS变量控制控制例如,你如果要指定:为你的分割符的话只需要定义变量IFS=“:”,这个非常有用,比如我现在要实现一个功能,要打印所有的用户所用shell,配置文件在/etc/passwd,可以执行下面的脚本:

      1 echo "-----------------"
      2 for line in `cat /etc/passwd`
      3 do 
      4   #echo line=$line
      5   count=0;
      6    IFS=":"
      7   for item in $line
      8   do
      9     if [ $count -eq 6 ];
     10         then echo $item
     11     fi 
     12     let count+=1;
     13   done
     14 done
    当然实现方法多种多样,你可以有很多方案选择。

    下面轮到非常重要的知识点:函数。

    shell在函数定义的时候使用function来定义,而调用函数的时候直接使用函数名

    我们来看一下:

    funtion testfun(){} 或者是 testfun(){}

    这个是函数的定义,而在调用函数的时候我们直接使用testfun就可以了,不需要加上括号。其实我很喜欢这种设计,对于函数来说无非就是要参数和函数名,我为何要多此一举写括号浪费我时间呢~

    函数有三个东西是非常关键的,名字,参数,还有返回值,这些东西决定了一个函数的函数签名

    通常情况下函数的返回值为0,属于正常值.而函数的参数,可以通过函数的$0123来获取

    那么我是否可以指定参数名呢?~其实是不行的~至少我现在测试出来是不行的.当你需要打印所有的参数的时候可以选择$*或者$@.

    我们说我们采用定义变量的方式是无法被子进程所继承的,所以我们采用了export的方式来传递环境变量,那么函数是否可以呢?当然也是可以的我们在函数名前面加入export参数.我尝试了一下export testfun

    结果发现子进程中根本没有这个方法。这是因为它会采用变量的方式来传递这种东西,因此~当你要传递一个方法的时候,要在export后面加上参数-f代表这是一个function.

    我们说函数有三要素,函数名,参数,和返回值。我们要怎么获得返回值呢?shell里面定义了一个$?来存储返回值,它的功能很像寄存器AX。我们 可以通过返回值来确定程序执行的方向。那么$?到底是函数的返回值还是程序的返回值呢?其实这两个并不矛盾,我们知道程序本身的入口也是main函数,当 然我们这么说并不准确,我只是想说明程序的入口本质上也是函数,所以如果说$?是函数的返回值的话自然也是程序的返回值。

  • 相关阅读:
    urlrewrite地址重写的使用
    算法学习
    数据库之Case When
    速卖通返回503错误
    概述:软件开发工具
    c#将List<T>转换成DataSet
    表单域规范写法
    ant打包和jar包混淆
    Node.js文档和教程
    webpack开发和生产两个环境的配置详解
  • 原文地址:https://www.cnblogs.com/feizimo/p/3523877.html
Copyright © 2020-2023  润新知