1.linux shell 函数
将一组命令集或语句形成一个可用的块, 这些语句块称为函数。
2.shell 函数的组成
函数名:函数名字,注意一个脚本中函数名要唯一,否则会引起调用函数紊乱。
函数体: 函数内部命令的集合,实现一个业务的功能。
3.shell 函数定义的格式
function 函数名()
# function可以省略,注意()内部不带任何参数。
{
命令1
命令2
. . .
}
1.函数定义及引用实例一: 最简单的定义及引用
#!/bin/sh
# 演练函数的定义及引用方法
# func_1.sh
function print_welcome() #function可以去掉,注意括号里不能有参数
{
echo "演练函数的定义及引用方法:"
echo "welcome,now time is `date`"
}
print_welcome #函数的名字,调用
[liu@WLJY01 myscript]$ sh func_1.sh
演练函数的定义及引用方法:
welcome,now time is Wed Aug 12 16:01:58 CST 2015
2.函数定义及引用实例二:向函数传递参数演练
向函数传递参数就像在一般脚本中使用特殊变量 1, 1 , 2 … $ 9一样,函数取得所传参数后,最好先在函数内重新设置变量保存所传的参数。
程序功能:向函数传递一个变量值,对该变量值进行相关的运算,并输出结果。
!/bin/sh
#演练函数内部参数的传递方法
#func_2.sh
function sum()
{
echo "演练函数内参数的传递的方法"
if [ $# -eq 2] #如果参数的个数等于2
then
echo "符合函数要求的参数个数"
a1=$1
a2=$2
let sum=a1+a2
else
echo "函数要求的参数个数不符,请重新输入..."
fi
echo "$a1+$a2=$sum"
}
sum 10 90 #函数名和两个参数,调用
[liu@WLJY01 myscript]$ sh func_2.sh
演练函数内参数的传递的方法(注意变量的接收方法)
符合函数要求的参数个数
10+90=100
3.函数文件和脚本文件不在同一个文件中,如何调用该函数?
程序功能:输入一个文件的路径,然后打印出这个文件的MD5摘要信息。
#!/bin/sh
#独立函数文件演练
#func_3.sh
function file_md5()
{
if [ $# -nq 1] #如果参数的个数不等于1
then
echo "函数参数个数有误,请输入一个参数"
else
filename=$1
md5=$(md5sum $filename)
echo "$filename 的md5摘要为:$md5"
fi
}
#注意这里没有因用户函数,也没提供参数
#!/bin/sh
#演练函数的载入与调用
#func_call.sh
. ./func_3.sh #注意格式:点 空格 函数文件地址
while [ 1 ]
do
read -p "请输入一个文件名:" file
file_md5 $file #在这里调用函数,传入参数
done
[liutaostdio@WLJY01 myscript]$ cat func_3.sh # 函数文件
[liutaostdio@WLJY01 myscript]$ sh func_call.sh # 脚本文件
请输入一个文件名:test1.sh
test1.sh 的md5摘要为:5615ac3ce36ec58748a80649c3599d88 test1.sh
请输入一个文件名:test2.sh
test2.sh 的md5摘要为:4446b536dff610ea440663147914c52b test2.sh
请输入一个文件名:ttt.sh
ttt.sh 的md5摘要为:5615ac3ce36ec58748a80649c3599d88 ttt.sh
注意函数导入的方法:
. 空格符 文件名
1.数组的定义
在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来,这些按序排列的同类数据元素的集合称为数组。
数组的定义:
数组名=(元素1 元素2 元素n)
# 一对括号表示是数组,数组元素用“空格”符号分割开来。
如:myarray=(1 3 5 7 9)
# 注意定义的方法,小括号、逗号。
2.数组常用操作
1)定义一个数组: myarray=(1 2 3 4 5);
2)读取数组的某一个元素 :
echo ${myarray[下标值]}
# 注意数组名称必须使用{} 括起来, 下标值从0开始编号;
3)数组元素的赋值:
myarray[下标值] = xxx ;
4)显示数组的所有元素:
echo ${myarray[*]};
5)获得数组的长度(元素的个数):
echo ${#array[@]}
或者 echo ${#array[*]};
6)删除一个数组元素:
unset myarray[下标值]
3.数组常用操作的演练,参考程序:
#!/bin/sh
#演示数组的定义及常用操作
myarray=(0 1 2 3 4 5 6 7 8 9 10)
echo "数组myarray 初始的所有元素是: ${myarray[*]}"
echo "数组myarray 第一个元素的值是myarray[0]:${myarray[0]}"
echo "数组myarray的长度是:${#myarray[@]}"
echo "数组myarray的长度是:${#myarray[*]}"
#修改第一个元素的值
myarray[0]=9999
echo "修改第一个元素后,数组myarray的所有元素是:${myarray[*]}"
#删除第一个元素的值
unset myarray[0]
echo "删除第一个元素后,数组myarray的所有元素是:${myarray[*]}"
[liutaostdio@WLJY01 myscript]$ sh array_1.sh ;
数组myarray 初始的所有元素是: 0 1 2 3 4 5 6 7 8 9 10;
数组myarray 第一个元素的值是myarray[0]: 0;
数组myarray 的长度是: 11;
数组myarray 的长度是: 11;
修改第一个元素后,数组myarray 的所有元素是: 9999 1 2 3 4 5 6 7 8 9 10;
删除第一个元素后,数组myarray 的所有元素是: 1 2 3 4 5 6 7 8 9 10。
1.常规方法输出数组的所有元素,并进行独立的处理。
用 ${myarray[*]} 直接输出的所有元素的个数,对数组元素进行独立操作的时候,不太方便,所以有必要。
#!/bin/sh
# 循环读取数组列表演示
myarray=(0 1 2 3 4 5 6 7 8 9 10)
len=${#myarray[@]}
echo "数组长度:$len"
echo "数组的元素依次为:"
for ((i=0;$i1
done
[liutaostdio@WLJY01 myscript]$ sh array_2.sh
数组长度:11
数组的元素依次为:
0
1
2
3
...
2.有时候不知道数组中元素的个数,因此数组的长度事先是不知道的,因此此时,需要动态的扩展数组长度与空间。
#!/bin/sh
# 循环读取数组列表演示
# 功能:在授权有效期内形成机器可信任列表
# 执行方法:脚本名 有效日期 server1 server2 server3 server...
# 获得所有参数存入数组
list=($*)
len=${#list[@]}
# 第一个元素为有效期
echo ${list[0]}>./trustip.txt #输出到txt文件
for ((i=1;$i<$len;i++))
do
echo "${list[$i]}" >>./trustip.txt #追加到txt文件
done
#显示这个时间可信任的IP列表
cat ./trustip.txt
[liutaostdio@WLJY01 myscript]$ sh array_3.sh 2015-08-15 119.24.21.0/24 119.24.22.0/24 119.24.23.0/24 119.24.24.0/24
2015-08-15 119.24.21.0/24 119.24.22.0/24 119.24.23.0/24 119.24.24.0/24
2015-08-15
119.24.21.0/24
119.24.22.0/24
119.24.23.0/24
119.24.24.0/24