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函数,当 然我们这么说并不准确,我只是想说明程序的入口本质上也是函数,所以如果说$?是函数的返回值的话自然也是程序的返回值。

posted @ 2014-01-17 13:14  非子墨  阅读(275)  评论(0编辑  收藏  举报