此次咱们回顾一下函数的定义,在此以前,如咱们学习结构化编程同样,任何语言都脱离不了某种范式,咱们先从这些范式入手。首先是条件判断。shell
具体的结构是:编程
if condition;函数
then command;学习
elif condition;测试
then commands;.net
else设计
command;继承
fi进程
condition的编写能够经过test命令或者是[]算子。好比test $m -eq 0 或者是[ $m -eq 0 ]get
接着是迭代:迭代的集合类数据以逗号或者是空格分割
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函数,当 然咱们这么说并不许确,我只是想说明程序的入口本质上也是函数,因此若是说$?是函数的返回值的话天然也是程序的返回值。