本文已参与「新人创作礼」活动,一起开启掘金创作之路。
二、函数
函数
-
==没有参数列,没有返回值,return返回的是状态码,使用$?查看==
-
定义函数:
function test1() { #这个return的值,表示这个函数之后之后返回的状态码,而不出返回值, #不能通过a=test()来获取100值 #可以通过echo $?来获取 return 100 } #function去掉 test() { } #去掉括号 function test { } #function和()至少保留一个,否则无法识别成函数ss -
案例:
#!/bin/bash function test1() { a=200 #a=100 #这个return的值,表示这个函数之后之后返回的状态码,而不出返回值, #不能通过a=test()来获取100值 #可以通过echo $?来获取 if [ $a -eq 100 ]; then return 0 else echo "hello test1" return 100 fi } #function去掉 test2() { echo "hello test2" } #去掉括号 function test3 { echo "hello test3" #如果函数没有return值,那么最后一条执行命令的状态码,就是这个函数的状态码 } #function和()至少保留一个,否则无法识别成函数ss v1=`test1` if [ $? -eq 0 ];then echo "test1执行成功! a=100" else echo "test1执行之后,a!=100" fi #echo "test1 的返回状态码:" $? #echo "v1 : " "$v1" test2 test3
-
小结:
-
执行状态$?看return的返回值,如果没有返回值,则以最后一条命令的返回值为准
test2() { echo "hello test2" cp #echo $? 1 } -
return修饰的状态码只能是数字
function test3 { echo "hello test3" #./functest.sh: line 26: return: beijing: numeric argument required return "beijing" #这是错误的用法,必须是数字 }
-
-
函数参数:
-
调用方法与命令一样,也是2 ..
test4() { echo "test4 函数参数为: $1, $2" } test4 "hello" "world"
-
-
案例:递归遍历指定目录的文件!
#!/bin/bash
#案例:递归遍历指定目录的文件!
#目录由用户通过命令行传入:
#./recursive.sh ..
recursive()
{
#接收用户输入的目录
#currDir="$1"
local currDir="$1"
echo "====> 当前目录为:" "$currDir"
#遍历当前目录
for i in `ls $currDir`
do
#这样才是有效的路径,后续才能正确判断性质
#item="$currDir+"/"+$i" <<=== 这是错误的, /usr/+/+test.txt
item="$currDir/$i"
#echo "item: " $item
#如果i是文件,则打印
if [ -f "$item" ]; then
echo "文件找到: $item"
elif [ -d "$item" ];then
#如果i是文件夹,则递归遍历
echo "文件夹找到:" "$item"
recursive $item
else
echo "未知文件:" "$item"
fi
done
}
#判读输入参数的个数
if [ $# -ne 1 ];then
echo "Usage: recursive <文件目录>"
exit
fi
recursive $1
调试
shell调试参数:
-
-n 帮助我们快速检查脚本的语法,而不是逐条执行
- 脚本如果很大,中间执行过程很长,如果不能实现发现脚本错误,会浪费时间
-
bash -n ./recursive.sh
-
-x,执行脚本的同时将代码执行过程打印到屏幕,便于追踪
-
bash -x recursive.sh ==》 作用于整个脚本
-
可以在代码中,对指定的代码段进行调试
-
set -x ==> 启动调试
-
xxxx
-
set +x ==> 停止调试
-
-
- -v,一边执行脚本,一边打印错误输出(很少用)
shift 8 ==> *, 快速定位当前光标所值单词(向下寻找,n)
shift 3 ==> #, 快速定位当前光标所值单词(向上寻找,n)