我是靠谱客的博主 聪明荷花,最近开发中收集的这篇文章主要介绍shell中函数的一点事儿,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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中函数的一点事儿所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部