bash脚本函数和数组

    函数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

(0)
M20-1马星M20-1马星
上一篇 2016-08-24 21:22
下一篇 2016-08-24 21:22

相关推荐

  • MogileFS基于Nginx反向代理实现分布式存储与访问

    前言 随着信息社会的发展,越来越多的信息被数据化,尤其是伴随着大数据时代的来临,数据呈爆炸式增长。传统存储在面对海量数据存储表现出的力不从心已经是不争的事实,例如:纵向扩展受阵列空间限制,横向扩展受交换设备限制,节点受文件系统限制等。而分布式存储的出现在一定程度上有效的缓解了这一问题,目前比较流行的分布式文件系统有:GFS、HDFS、GlusterFS、Mo…

    Linux干货 2015-07-08
  • 四大开源协议的异同:GPL、LGPL、BSD、Apache

    便于自身理解四大常用开源协议的异同之处。

    Linux干货 2017-10-25
  • 初识Linux

    在这篇文章中你讲看到如下内容: 1.       计算机的组成及功能; 2.       Linux发行版之间的区别和联系; 3.       Linux发行版的基础目录及功用规定…

    Linux干货 2016-12-01
  • vsftp简单应用

    vsftp配置详解 前言 FTP(File Transfer Protocol)是文件传输协议的简称。它能让用户 连接上一个远程计算机(运行着 FTP 服务器程序)查看远程 计算机上有哪些文件,然后把文件从远程计算机上下载到 本地计算机,或把本地计算机文件上传到远程计算机。但是ftp是一种古老的文件传输协议,是明文传输,特别的不安全所以就有了vsftp。 一…

    Linux干货 2016-12-18
  • LVM基本原理及使用

    LVM简介 LVM全称Logical Volume Manager(逻辑卷管理),是将几个物理分区(或硬盘)通过软件组合成一块看起来是独立大硬盘(VG),然后对这块大硬盘分割成可使用的逻辑卷(LV),最终能够挂载使用,以达到对磁盘空间进行弹性管理的目的。 LVM的基本原理 基本术语 dm(device mapper):将一个或多个底层块设备组织成一个逻辑设备…

    Linux干货 2016-04-17
  • 基于LNMP网站平台,测试增加memcached缓存系统后网站访问效果

    LNMP安装教程链接:22-love cat 17周博客作业第2部分-构建一个LVS-DR模型的高性能集群 memcached 安装及测试效果 一、概念     memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态…

    Linux干货 2016-08-22