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