2.1.2 shell脚本函数

函数 function

    函数介绍

    和其他语言一样,在 Shell 语言中也有着函数。尽管在Shell中函数并非是必须的编程元素,但是通过使用函数,可以对程序进行更加好的组织。将一些相对独立的代码变成函数,可以提高程序的可读性和重用性。避免重复编写大量相同的代码。

    与 shell 脚本不同的是:函数的生效范围尽在当前 shell 中运行,而 shell 脚本则在子 shell 中运行。

    函数定义

    语法

函数名 (){
	函数体
}

    函数可以在脚本中直接定义,也可以存放在文件中,在脚本中调用。而函数的生命周期就是在被调用时开始,在得到返回值时结束

    函数调用

1)如果函数在脚本中,直接给出函数名则调用该函数;

2)如果函数在其他文件中,则需要 source 函数文件后再调用函数。

    范例1:打印指定大小的棋盘图案

#!/bin/bash
color1 (){
	for ((j=1;j<=ength;j++)) ;do
		echo -e "\033["$colour1"m \033[0m\c"
	done
}

color2 (){
	for ((j=1;j<=ength;j++)); do
		echo -e "\033["$colour2"m \033[0m\c"
	done
}

checksodd (){
	if [ $[$column%2] -eq 0 ] ;then
		for ((i=1;i<=$[column/2];i++)) ;do
			color1
			color2
		done
	else
		for ((i=1;i<=$[column/2];i++)) ;do
			color1
			color2
		done
		color1
	fi
	echo
}

checkseven (){     
	if [ $[$column%2] -eq 0 ] ;then
		for ((i=1;i<=$[column/2];i++)) ;do
			color2
			color1
		done
	else
		for ((i=1;i<=$[column/2];i++)) ;do
			color2
			color1
		done
		color2

	fi	
	echo

}

echo "┌─────────────────────────────────────────────────┐"
echo "│                                                 │"
echo -e "│ 1.\033[30mblack\033[0m      2.\033[31mred\033[0m        3.\033[32mgreen\033[0m      4.\033[33myellow\033[0m │"
echo -e "│ 5.\033[34mblue\033[0m       6.\033[35mpurple\033[0m     7.\033[36mcerulean\033[0m   8.\033[37mwhite\033[0m  │"
echo "│                                                 │"
echo "└─────────────────────────────────────────────────┘"

read -p "colour is " choice1 choice2
if [ $choice1 -gt 8 -o $choice2 -gt 8 ] ;then
	echo "No such color"
	exit
else
	colour1=$[$choice1+39]; colour2=$[$choice2+39]
fi
read -p "the chessboard range is: " line column
read -p "the checks size is: " ength width

for ((l=1;line>=l;l++)) ;do
	if [ $[$l%2] -eq 1 ] ;then
		for ((w=1;width>=w;w++)) ;do
			checksodd
		done
	else
		for ((w=1;width>=w;w++)) ;do
			checkseven
		done
	fi
done
    范例2:复制指定命令的库
#!/bin/bash
copy_lib (){
	seat="`which --skip-alias $CMD`"
	cp --parents $seat /data/sysroot
	echo `ldd $seat | sed -n '2,$p' | sed -r "s#\t(.* )?(/.*) \(.*#\2#"`
}

while : ;do
	read -p "input a command: " CMD
	if [ $CMD = q ] ;then
		exit
	fi
	
	copy_lib | while read line ;do
		cp --parents $line /data/sysroot
		echo "copy $CMD sucess"
	done
done
#!/bin/bash
#
#********************************************************************
#Author:		M30_Miriam
#Tel:                   13803833736
#Date: 			2018-05-11
#FileName:		copycmd.sh
#Copyright (C): 	2018 All rights reserved
********************************************************************
copy_lib (){
	seat="`which --skip-alias $CMD`"
	cp --parents $seat /data/sysroot
	echo `ldd $seat | sed -n '2,$p' | sed -r "s#\t(.* )?(/.*) \(.*#\2#"`
}

while : ;do
	read -p "input a command: " CMD
	if [ $CMD = q ] ;then
		exit
	fi
	
	copy_lib | while read line ;do
		cp --parents $line /data/sysroot
		echo "copy $CMD sucess"
	done
done

    函数的返回值

    1)函数体中的命令输出

    2)函数体中命令的退出状态码

    范例:计算斐波那契数列

#!/bin/bash

ADD (){
	if [ $1 -eq 1 ]; then
		echo 0
		return
	elif [ $1 -eq 2 ]; then
		echo 1
		return
	else
		res1=`fib $(( $1-1 ))`
		res2=`fib $(( $1-2 ))`

		echo $((res1+res2))
	fi
}
read num
ADD $num

    删除函数使用 unset 函数名 便可以删除指定函数。


    函数的递归

    函数中可以在函数体中调用其他函数,包括自身

    范例:解决汉诺塔问题

#!/bin/bash

step=0
move (){
	let step++
	echo "$step:  move disk $1   $2 -----> $3"
	}
hanoi(){
	if [ $1 -eq  1 ];then
		move $1 $2 $4
	else
		hanoi "$[$1-1]" $2 $4 $3
		move $1 $2 $4					
		hanoi  "$[$1-1]" $3  $2  $4
	fi
}
read -p "please input the  number of plates: "  number
hanoi $number A B C

















    

猜你喜欢

转载自blog.csdn.net/m30_miriam/article/details/80314850
今日推荐