什么是函数
函数是一个函数名到某个代码块的映射。Shell函数从形式上看与Shell脚本没有明显区别。
但是在调用的时候系统会为一个单独的Shell脚本创建一个新的进程,
而函数调用时不会创建新进程,而是在调用者的Shell进程中直接解释并执行函数中的代码。
函数的定义
function_name(){
statement1
statement2
...
statementn
}
function function_name(){
statement1
statement2
...
statementn
}
函数名只能使用数字、字母、下划线,而且只能以字母或者下划线为开头。
函数的调用
function_name param1 param2 ...
函数链接
函数链接是指在某个Shell函数中调用另外一个函数的过程。与其他设计语言一样,Shell允许用户函数的嵌套调用。
要保证先定义函数,再调用
返回值
使用return返回一个数值,但是这个数值只能在0~255之间。
别名
alias name="command"
unalias name
当前脚本里删除函数,使用unset function_name
unset function_name
用户不能为一组命令指定别名。
别名中不能通过系统变量操作参数列表
函数与全局变量,局部变量
函数中的变量也是全局变量,使用local关键字进行修饰则是局部变量。
函数的参数
function arg1 arg2 ...
使用shift命令来使得脚本的所有位置参数向左移动一个位置,从而使得用户可以通过9以内的位置变量来获取超过9个的参数。
#! /bin/bash
func(){
while( ($# > 0) )
do
echo "$1"
shift
done
}
shift命令:将传递给函数func()的位置参数向左移动一个位置,同时删除原来的第1个参数。所以它会影响到系统变量$#的值。
getopts使用介绍...
间接参数传递:例如:var=name name=john 变量var的值是变量name的名字,可以使用{!var}得到变量name的值。
传递数组参数:function_name "${array[@]}"
函数库文件
函数库文件与普通的脚本结构完全相同。函数库文件由主程序载入并执行的,所以用户无需拥有库文件的执行权限,只要拥有管理权限即可。当库文件定义好之后,用户就可以在程序中载入库文件,并且调用其中的函数。在Shell中载入库文件的命令为.,即一个圆点,其语法如下:
. filename
数组的定义
1.通过指定元素值来定义数组
array[1]=one
array[2]=three
这会定义一个数组array。
2.通过declare语句定义数组
declare -a array 普通数组,数字下标
declare -A array 关联数组
3.通过元素值集合定义数组
array=(v0,v2,v3,...,vn)
4.通过键值对定义数组
array=([0]=value0 [1]=value1 [2]=value2 ... [n]=valuen)
普通变量实际上可以当做只有一个元素的数组
数组的赋值
按索引为元素赋值
array[n] = valuen
declare -A array #声明关联数组
array=([john]=90 [rose]=80 [tom]=100)
通过集合为数组赋值
array=(v0,v2,v3,...,vn)
通过循环为数组元素赋值
#! /bin/bash
for i in {1..10}
do
array[$i]=$i
done
数组的访问
array[n]
直接${array}得到的是数组的第一个元素值
${#array[@]}
${#array[*]}
${#array[n]}获取数组元素的长度
len="${#array[@]}"
for(i=0;i<len;i++)
do
echo "${array[$i]}"
done
数组的操作
"${array[@]}"全部数组元素
获取一部分数组元素:
${array[@ | *]:start:end}
(${array[@ | *]:start:end}) 加上()后,得到的还是数组
获取数组元素的一部分:${array[n]:start:end}
数组元素替换:${array[@|*]/pattern/replacement} pattern是要搜索的字符串(我想应该支持正则表达式)replacement是要代替的字符
删除数组元素 unset array[n]
删除数组unset array
复制数组newarray=("${array[@]}")
连接数组("${array1[@]}" "${array2[@]}")
加载文件至数组
cat demo.txt
USA
China
UK
Russia
content=(`cat "demo.txt"`)
for s in "${content[@]}"
do
echo "$s"
done