概述
Linux命令、编辑器、shell编程实例大全----第十九章函数
1. 函数简介 1
<1>.return返回上一个命令的退出状态或是给定值 1
<2>.exit退出整个脚本 1
<3>.函数中使用break语句中断函数执行 1
<4>.declare -f 显示定义的函数清单。 1
<5>.exprot -f 将函数导出给shell 2
<6>.unset -f 从shell内存中删除函数。 2
2. Shell中的调用顺序 2
3. 函数的传参 2
4. 函数的返回值 4
5.将函数载入到内存 5
6. 删除函数 7
7. 函数的作用域 7
8.最简单的递归调用 7
1.函数简介
【function】函数名
{
命令表
【Return】
}
说明:
<1>.return返回上一个命令的退出状态或是给定值
<2>.exit退出整个脚本
root@ubuntu-vm:/home/2014-12-15# cat exit.sh
#! /bin/bash
function test
{
echo "function calling ...!"
exit
}
echo "call function start"
test
echo "call function end"
root@ubuntu-vm:/home/2014-12-15# ./exit.sh
call function start
function calling ...!
root@ubuntu-vm:/home/2014-12-15#
<3>.函数中使用break语句中断函数执行
<4>.declare -f 显示定义的函数清单。
root@ubuntu-vm:/home/2014-12-15# declare -f
command_not_found_handle ()
{
if [ -x /usr/lib/command-not-found ]; then
/usr/bin/python /usr/lib/command-not-found -- "$1";
return $?;
else
if [ -x /usr/share/command-not-found/command-not-found ]; then
/usr/bin/python /usr/share/command-not-found/command-not-found -- "$1";
return $?;
else
printf "%s: command not foundn" "$1" 1>&2;
return 127;
fi;
fi
}
root@ubuntu-vm:/home/2014-12-15# declare -F
declare -f command_not_found_handle
root@ubuntu-vm:/home/2014-12-15#
# -x判断文件存在且可执行
<5>.exprot -f 将函数导出给shell
<6>.unset -f 从shell内存中删除函数。
2.Shell中的调用顺序
shell在执行一个别名、函数、内部命令、基于磁盘的可执行文件(执行顺序也是如此)
root@ubuntu-vm:/home/2014-12-15# function mydate
> {
> echo "start ..."
> date
> echo "end ..."
> }
root@ubuntu-vm:/home/2014-12-15# mydate
start ...
Mon Dec 15 19:16:29 CST 2014
end ...
root@ubuntu-vm:/home/2014-12-15# declare -f
mydate ()
{
echo "start ...";
date;
echo "end ..."
}
root@ubuntu-vm:/home/2014-12-15#
3.函数的传参
$函数名 参数1 参数2 ......
$函数名 $1 $2 ......$9
实例1.
root@ubuntu-vm:/home/2014-12-15# cat args.sh
#! /bin/bash
#function:function argsment
function argss
{
echo $1 $2 $3
echo $a $b $c
return
}
a=111
b=222
c=333
argss a b c
root@ubuntu-vm:/home/2014-12-15# ./args.sh
a b c
111 222 333
root@ubuntu-vm:/home/2014-12-15#
实例2.
root@ubuntu-vm:/home/2014-12-15# cat verif.sh
#! /bin/bash
function verif
{
if [ $1 = "root" ] && [ $2 = "123456" ];then
echo "success login!"
else
echo "failed login!"
fi
return
}
verif "roota" "123456"
echo "***************"
verif "root" "123456"
root@ubuntu-vm:/home/2014-12-15# ./verif.sh
failed login!
***************
success login!
root@ubuntu-vm:/home/2014-12-15#
实例3:
root@ubuntu-vm:/home/2014-12-15# chmod u+x strcat.sh
root@ubuntu-vm:/home/2014-12-15# cat strcat.sh
#! /bin/bash
function mystrcat
{
echo $1$2
}
echo "input one string:"
read STR1
echo "input other one string:"
read STR2
echo "strcat:"
mystrcat $STR1 $STR2
root@ubuntu-vm:/home/2014-12-15# ./strcat.sh
input one string:
zhang
input other one string:
san
strcat:
zhangsan
root@ubuntu-vm:/home/2014-12-15#
4.函数的返回值
函数的返回值在没有指定的情况下,保存在$?中。
root@ubuntu-vm:/home/2014-12-15# cat reverif.sh
#! /bin/bash
function verif
{
if [ $# -ne 2 ];then
return 1
fi
if [ $1 = "root" -a $2 = "123456" ];then
return 2
fi
if [ $1 != "root" -a $2 = "123456" ];then
return 3
fi
if [ $1 = "root" -a $2 != "123456" ];then
return 4
fi
if [ $1 != "root" -a $2 != "123456" ];then
return 5
fi
}
verif $1 $2
case $? in
1)echo "参数个数不对";;
2)echo "验证通过";;
3)echo "用户名不对";;
4)echo "密码不对";;
5)echo "用户名与密码不对";;
esac
root@ubuntu-vm:/home/2014-12-15# ./reverif.sh
参数个数不对
root@ubuntu-vm:/home/2014-12-15# ./reverif.sh root 123456
验证通过
root@ubuntu-vm:/home/2014-12-15# ./reverif.sh root 12345
密码不对
root@ubuntu-vm:/home/2014-12-15# ./reverif.sh roo 123456
用户名不对
root@ubuntu-vm:/home/2014-12-15# ./reverif.sh afjds jlafds
用户名与密码不对
5.将函数载入到内存
函数定义可以放在:~/.bash.profile"中。
可以直接放命令行。
可以放脚本中。
如果需要的函数保存在其他的脚本文件中,可以使用“.”或是“source”把命令装入到内存中,以供当前脚本使用。
root@ubuntu-vm:/home/2014-12-15# declare -f
command_not_found_handle ()
{
if [ -x /usr/lib/command-not-found ]; then
/usr/bin/python /usr/lib/command-not-found -- "$1";
return $?;
else
if [ -x /usr/share/command-not-found/command-not-found ]; then
/usr/bin/python /usr/share/command-not-found/command-not-found -- "$1";
return $?;
else
printf "%s: command not foundn" "$1" 1>&2;
return 127;
fi;
fi
}
root@ubuntu-vm:/home/2014-12-15# . reverif.sh
参数个数不对
root@ubuntu-vm:/home/2014-12-15# declare -f
command_not_found_handle ()
{
if [ -x /usr/lib/command-not-found ]; then
/usr/bin/python /usr/lib/command-not-found -- "$1";
return $?;
else
if [ -x /usr/share/command-not-found/command-not-found ]; then
/usr/bin/python /usr/share/command-not-found/command-not-found -- "$1";
return $?;
else
printf "%s: command not foundn" "$1" 1>&2;
return 127;
fi;
fi
}
verif ()
{
if [ $# -ne 2 ]; then
return 1;
fi;
if [ $1 = "root" -a $2 = "123456" ]; then
return 2;
fi;
if [ $1 != "root" -a $2 = "123456" ]; then
return 3;
fi;
if [ $1 = "root" -a $2 != "123456" ]; then
return 4;
fi;
if [ $1 != "root" -a $2 != "123456" ]; then
return 5;
fi
}
root@ubuntu-vm:/home/2014-12-15#
6.删除函数
root@ubuntu-vm:/home/2014-12-15# declare -F
declare -f command_not_found_handle
declare -f verif
root@ubuntu-vm:/home/2014-12-15# unset -f verif
root@ubuntu-vm:/home/2014-12-15# declare -F
declare -f command_not_found_handle
root@ubuntu-vm:/home/2014-12-15#
7.函数的作用域
非local标明的就是全局变量,否则就是局部变量。
当在函内外定义了相同名称的全局变量与局部变量时,即当全局作用域与局部作用域发生重叠时,按就近原则处理。
8.最简单的递归调用
root@ubuntu-vm:/home/2014-12-15# cat reverse.sh
#! /bin/bash
function reverse
{
local t
echo $1
if [ $1 -gt 0 ];then
t=$(($1-1))
reverse $t
fi
}
reverse $1
root@ubuntu-vm:/home/2014-12-15# ./reverse.sh
./reverse.sh: line 7: [: -gt: unary operator expected
root@ubuntu-vm:/home/2014-12-15# ./reverse.sh 4
4
3
2
1
0
root@ubuntu-vm:/home/2014-12-15#
注:
使用递归代码可读性高些,但是递归执行时耗用内存比较到,一般递归与循环是可以替换的。
最后
以上就是聪明荷花为你收集整理的shell中函数的一点事儿的全部内容,希望文章能够帮你解决shell中函数的一点事儿所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复