函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程。它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序的一部分。
函数和shell程序比较相似,区别在于:
(1)Shell程序在子Shell中运行。
(2)而Shell函数在当前Shell中运行。因此在当前Shell中,函数可以对shell中变量进行修改。
注意:必须在调用函数地方之前,声明函数,shell脚本是逐行运行。函数的生命周期;每次被调用时创建,返回时终止
1) 定义函数的代码段不会自动执行,在调用时执行;所谓调用函数,在代码中给定函数名即可;
2) 函数名出现的任何位置,在代码执行时,都会被自动替换为函数代码;
=========================================================
定义函数的格式
函数名()
{
命令1
. . .
}
或者
函数名(){
命令1
. . .
}
==========================================================
两者方式都可行。如果愿意,可在函数名前加上关键字f u n c t i o n,这取决于使用者。
f u n c t i o n 函数名()
{ …
}
可以将函数看作是脚本中的一段代码,但是有一个主要区别。执行函数时,它保留当前
s h e l l和内存信息。此外如果执行或调用一个脚本文件中的另一段代码,将创建一个单独的
s h e l l,因而去除所有原脚本中定义的存在变量。
在脚本中定义函数
hello(){ echo "hello today is `date`" }
在脚本中使用函数
#!/bin/bash # # hello(){ echo "hello today is `date`" } echo "the is call function" hello echo "call function finish"
执行结果
the is call function hello today is 2016年 08月 22日 星期一 09:44:22 CST call function finish
函数返回值:
函数的执行结果返回值:
(1)使用echo或者printf命令进行输出;
(2)函数体中调用的命令的执行结果;
函数的退出状态码:
(1)默认取决于函数体中执行的最后一条命令的退出状态码;
(2)自定义:return
传递参数给函数;
在函数体中,可以使用$1,$2…引用传递给函数的参数;还可以在函数中使用$*或$@引用所有参数,$#引用传递的参数的个数;
在调用函数时,在函数名后面以空白符分割给定参数列表即可,例如, testfunc arg1 agr2 arg3…
#!/bin/bash # # return 1: user exists [ $# -lt 1 ] && echo "enter noe username" && exit 1 adduser(){ if id $1 &> /dev/null;then return 1 else useradd $1 retval=$? return $retval fi } for i in {1..100};do adduser ${1}${i} retval=$? if [ $retval -eq 0 ];then echo "add user ${1}${i} finished" elif [ $retval -eq 1 ];then echo "user ${1}${i} exists" else echo "unkown error" fi done
变量作用域:
局部变量:作用域是函数的生命周期;在函数结束时被自动销毁
定义局部变量的方法;local variable=value
本地变量:作用域是运行脚本的shell进程的生命周期;因此,其作用范围为当前shell脚本进程
#!/bin/bash # # name=tom setname(){ local name=jerry echo "function:$name" } setname echo "shell: $name"
如果不使用local就会出现如下情况
#!/bin/bash # # name=tom setname(){ name=jerry echo "function:$name" } setname echo "shell: $name"
执行结果
function:jerry shell: jerry
数组
数组:
数组:存储多个元素的连续的内存空间;
数组名:整个数组只有一个名字;
数组索引:编号从0开始
引用方式:数组名【索引】
${array_name[index]}
注意:bash-4及之后的版本,支持自定义索引格式,而不仅仅是0.12,…数字格式
此类数组称之为“关联数组”
声明数组:
declare -a NAME:声明索引数组;
declare -A NAME:声明关联数组:(必须先声明,再使用)
数组中元素的赋值方式:
(1)一次只赋值一个元素
ARRY_NAME[index]=value
]#name[0]=ali ]#echo $name ali
(2)一次赋值全部元素;
arry_name=("val1" "val2" "val3"….)
]#name=(ali Aisha mohamed) ]#echo ${name[*]} ali Aisha mohamed
(3)只赋值特定元素;
arry_name=([0]="val1" [3]="val4"…)
]#name=([0]=ali [3]=mohamed) ]#echo ${name[*]} ali mohamed
注意:bash支持稀疏格式的数组
(4)read -a arry_name
]#read -a name Aisha ali mohamed ]#echo ${name[*]} Aisha ali mohamed
引用数组中的元素:${arry_name[index]}
注意:引用时,只给数组名,表示下标为0的元素
]#echo ${name} Aisha
${arry_name[*]}:引用数组中的所有元素
${arry_name[@]}:
]#echo ${name[*]} Aisha ali mohamed
数组的长度(数组中的元素的个数);
${#arry_name[*]}
${#arry_name[@]}
]#echo ${#name[*]} 3
数组元素切片:${arry_name[@]:offset:number}
offset:要跳过的元素个数;
number:要取出的元素个数;省略number时,表示取偏移量之后的所有元素;
向非稀疏格式数组中追加元素
arry_name[${#arry_name[*]}]=
删除数组中的某元素
unset arry[index]
关联数组;
declare -A arry_name
arry_name=([index_name1]="value1" [index_name2]="value2"…)
完
原创文章,作者:M20-1马星,如若转载,请注明出处:http://www.178linux.com/38783