bash脚本编程之函数

1、bash脚本编程函数的作用?

答:函数的主要功能是为了代码重用,模块化编程,是脚本的代码结构清晰。




2、函数的定义格式有几种,具体是什么格式?

答:函数的定义格式之一:

function  函数名{

    函数体

}

函数的定义格式之一:

函数名 () {

    函数体

}

实例:探测172.16.0.0内的所有主机的状态

#!/bin/bash
#*****************************************************************************************
#                              Check user login System                                   *
#                              zouhg 2014-12-3                                           *
#*****************************************************************************************
#*****************************************************************************************
#                               function code                                            *
#*****************************************************************************************
function Ping {
    ip=$1
    if ping -t1 -w1 $ip &> /dev/null;then
        echo -e "\033[32m$ip is On-line\033[0m"
    else
        echo -e "\033[31m$ip not On-line\033[0m"
    fi
}
#*****************************************************************************************
#                               Mian function code                                       *
#*****************************************************************************************
main() {
for i in {0..255};do
    for j in {1..254};do
        Ping 172.16.$i.$j
    done
done
}
main

3、函数的基本用法

函数的调用:使用函数名,函数名出现的地方,会被自动替换为函数代码

函数的返回值:函数的执行结果返回值:(1)函数中使用打印语句:echo、printf

                                  (2)函数体中系统命令执行结果的输出

函数的退出状态码:默认取决于函数体执行的最后一个命令的退出状态码。

自定义退出状态码:return [0-255] ;注意:函数体运行时,一旦遇到return语句,函数即返回

函数可接受参数:传递参数给函数:调用函数时,在函数名后给出参数列表即可;格式:函数名  参数1  参数2  参数3 ..

在函数体中可使用$1,$2......来调用传递过来的各参数;可使用类似脚本的特殊变量:$*,$@:一次性获取参数列表,$#:参数的个数。

实例:要求:1、列出当前系统上的所有磁盘设备;

           2、让用户选择一个磁盘设备,并在选择后显示指定设备上的所有分区信息;

           3、询问用户是否擦除此磁盘上的所有现存分区后重新添加三个分区;

                   y或yes: 继续

                   n或no: 中止脚本

                   其它字符则提醒用户重新输入合法的字符

            4、在用户选择是后执行相应的分区操作

                   创建三个分区

                   主分区1:512M,ext4

                   主分区2: 512M,swap

                   主分区3:2G,ext4

           5、将创建的分区按如上说明分别格式为相应的文件系统;

           6、将主分区1挂载至/mnt/boot目录,主分区3挂载至/mnt/sysroot目录;

#!/bin/bash
#**************************************************************************
#                          zouhg 2014-12-2                                *
#                          fdisk tool                                     *
#**************************************************************************
#**************************************************************************
#                      Function code section                              *
#**************************************************************************
function ListDsik {
	echo "The current system of disk:"
	fdisk -l |grep "Disk /dev/[sh]d" |cut -d: -f1|cut -d' ' -f2
}

function ListPart {
	if [ -b $1 ];then
		fdisk -l $1
		return 0
	else
		return 1
	fi
}

function CheckMount {
	if mount |grep "$1" &> /dev/null ;then
		for mountDisk in `mount |grep "$1" |cut -d' ' -f1`;do
			if ! umount $mountDisk &> /dev/null;then
				fuser -km $mountDisk &> /dev/null
				umount $mountDisk &> /dev/null
			fi
		done
	fi
}

function Partition {
	local dvice=$1
	dd if=/dev/zero of=$dvice bs=510 count=1 &> /dev/null
	echo -e "\033[32m$1 clean partitions successfully\033[0m"
	echo -e "n\np\n1\n\n+512M\nn\np\n2\n\n+512M\nn\np\n3\n\n+2G\nt\n2\nb8\nwq" |fdisk $dvice &> /dev/null
	partx -d $dvice  &> /dev/null
	partx -a $dvice  &> /dev/null
	echo  -e "\033[32mCreate partitions successfully \033[0m"
}

function Mkfs {
	local mk_type=$1
	local dir_dvice=$2
	if [ $mk_type == "swap" ];then
		mkswap $dir_dvice &> /dev/null
	else
		mkfs -t $mk_type $dir_dvice &>/dev/null
	fi
	echo -e "\033[32mmkfs $dir_dvice successfully\033[0m" 
}

function Mount {
	local dir_dvice=$1
	local dir_point=$2
	if [ -d  $2 ] ;then
		mount ${dir_dvice} $dir_point &> /dev/null
	else
		mkdir -p $dir_point &> /dev/null
		mount ${dir_dvice} $dir_point &> /dev/null
	fi
	echo -e "\033[32mmount $dir_dvice successfully\033[0m"
}
	
#**************************************************************************
#                          The main function of part of the code          *
#**************************************************************************

main(){
	while true ;do
		ListDsik
		read -p "Please enter an existing disk:" disk
		if ListPart $disk;then
			while true;do
				read -p "Delete the partition table,select the automatically partition(yes/no):" delete
				case $delete in
				yes)
					CheckMount $disk
					Partition $disk
					Mkfs "ext4" ${disk}1
					Mkfs "swap" ${disk}2
					Mkfs "ext4" ${disk}3
					Mount ${disk}1 "/mnt/boot"
					Mount ${disk}3 "/mnt/sysroot"
					break;;
				no)
					break;;
				*)
					echo -e "\033[31mERR:Please input yes or no!!!\033[0m";;
				esac
			done
			break
		else
			echo -e "\033[31mERR:Disk equipment department \033[0m"	
		fi
	done
}

main