Shell函数与数组
2014-11-09 16:40
92 查看
什么是函数
函数是一个函数名到某个代码块的映射。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 ...
=valuen)
普通变量实际上可以当做只有一个元素的数组
数组的赋值
按索引为元素赋值
array
= 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
直接${array}得到的是数组的第一个元素值
${#array[@]}
${#array[*]}
${#array
}获取数组元素的长度
len="${#array[@]}"
for(i=0;i<len;i++)
do
echo "${array[$i]}"
done
数组的操作
"${array[@]}"全部数组元素
获取一部分数组元素:
${array[@ | *]:start:end}
(${array[@ | *]:start:end}) 加上()后,得到的还是数组
获取数组元素的一部分:${array
:start:end}
数组元素替换:${array[@|*]/pattern/replacement} pattern是要搜索的字符串(我想应该支持正则表达式)replacement是要代替的字符
删除数组元素 unset array
删除数组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
函数是一个函数名到某个代码块的映射。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 ...
=valuen)
普通变量实际上可以当做只有一个元素的数组
数组的赋值
按索引为元素赋值
array
= 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
直接${array}得到的是数组的第一个元素值
${#array[@]}
${#array[*]}
${#array
}获取数组元素的长度
len="${#array[@]}"
for(i=0;i<len;i++)
do
echo "${array[$i]}"
done
数组的操作
"${array[@]}"全部数组元素
获取一部分数组元素:
${array[@ | *]:start:end}
(${array[@ | *]:start:end}) 加上()后,得到的还是数组
获取数组元素的一部分:${array
:start:end}
数组元素替换:${array[@|*]/pattern/replacement} pattern是要搜索的字符串(我想应该支持正则表达式)replacement是要代替的字符
删除数组元素 unset array
删除数组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
相关文章推荐
- 以不同方式向Shell函数传递数组参数
- 4、Shell函数,Shell数组,变量替换
- linux基础学习第十二天(shell函数、数组以及yum使用及编译安装)
- shell函数与数组
- 第五章 Shell函数与数组
- Shell函数与数组
- JAVA 用数组实现环型队列
- 强转JAVA数组
- 不能小瞧的数组——数组用法的挖掘
- PHP中str_replace函数使用数组
- (int a[][]) //输出数组方法 { for(int i=0;i<a.length;i++) { for(int j=0;j<a[0].length;j++)
- 一个大型例子搞定 Javascript 的数组基础知识 ——总结《Javascript 权威指南》第六版数组基础知识
- java数组和集合
- 数组中的数分为两组,使得两个组的和的差的绝对值最小
- 非类型模板形参取数组的维数
- sdut OJ2141---图论--用的数组+BFS
- 第13周项目4-数组的排序(1)
- Android数组显示
- .net 基础知识大杂烩(4) ——数组
- 指针之函数的参数是数组的时候的本质