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