这次我们回顾一下函数的定义,在此之前,如我们学习结构化编程一样,任何语言都脱离不了某种范式,我们先从这些范式入手。首先是条件判断。
具体的结构是:
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函数,当 然我们这么说并不准确,我只是想说明程序的入口本质上也是函数,所以如果说$?是函数的返回值的话自然也是程序的返回值。