linux中shell的函数用法

1.语法
方法1:

函数名() {
    函数体
    return n
}

方法2:

function 函数名() {
    函数体
    return n
}

2.调用函数

调用函数,在函数体外写函数的名字即可,下面有一个简单的脚本来举例

#!/bin/bash

function fun1() {
    echo "I like westos"
}

fun1

3.引用函数
每次引用函数时,bash回重新回到函数的定义 ,用一个脚本来理解

#!/bin/bash

function fun1() {
    echo "I am a boy~"
}

count=1
while [ $count -le 5 ]
do
    fun1
    count=$[ $count + 1 ]
done

echo "End of loop"

fun1
echo "End of script"

如上面程序,函数每次被引用,都会重新回到定义,读取 I am a boy~

4.函数不一定要在最开始定义,但是如果函数在定义前就使用,会报错

例如下面这个脚本,fun2的使用在定义之前,所以执行的时候出现了错误

#!/bin/bash

count=1
echo "Before function definition"

function fun1() {
    echo "fun1"
}

while [ $count -le 5 ]
do
    fun1
    count=$[ $count + 1 ]
done

echo "End of loop"

fun2

function fun2() {
    echo "fun2"
}

5.函数名必须是唯一的,如果重新定义了函数,新的函数会覆盖旧的

#!/bin/bash

function fun1() {
    echo "first fun1"
}

fun1

function fun1() {
    echo "second fun1"
}

fun1

function fun1() {
    echo "third fun1"
}

fun1
echo "End"

如上图,调用一个函数,但是输出结果是三个不同的~

6.返回值
1)默认退出状态码:默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码,用下面的脚本来说明

#!/bin/bash

function fun1() {
    echo "trying to display a non-existent file"
    ls -l westosfile &> /dev/null
}

echo "test the function:"
fun1
echo "The exit status is : $?"

如上图,返回的是一个非零值,所以说这个命令未执行成功。

2)使用return命令
shell使用return命令来退出函数并返回特定的退出状态码 ,把上一个脚本修改一下,,加个retutn 0

#!/bin/bash

function fun1() {
    echo "trying to display a non-existent file"
    ls -l westosfile &> /dev/null
    return 0
}

echo "test the function:"
fun1
echo "The exit status is : $?"

 

$?值变成了0

#!/bin/bash

function db1() {
    read -p "Enter a value:" value
    echo "doubling the value..."
    return $[ $value * 2 ]
}

db1

echo "The new value is $?"

 

 $?的值就变成了8

3)使用函数输出
将函数的输出保存在shell变量中
可以获得任何类型的函数输出
并将其保存到变量中

#!/bin/bash

function db1() {
    read -p "Enter a value:" value
    echo $[ $value * 2 ]
}

result=`db1`
echo "The new value is $result"

4)函数中使用变量
可以向函数中传递参数,函数名会在$0变量中定义函数命令行上的任何参数都会通过$1,$2定义,$#来判断传给函数的参数数目

#!/bin/bash

function fun1() {
    echo $[ $1 * $2 ]
}

if [ $# -eq 2 ];then
    value=`fun1 $1 $2`
    echo "The result is $value"
else
    echo "Usage:fun1 a b"
fi

 

5)函数不能直接从命令行获取脚本的参数值

如下面脚本,如果没有定义a和b分别是什么,这个脚本就处于不可用~

#!/bin/bash
a=$1
b=$2

function lei() {
    echo "-1"
}
function cheng() {
    echo " $a + $a = $[a+a] "
}
function zhi() {
    echo " $a + $b = $[a+b] "
}
	if [ $# == 0 ];then
	lei
	elif [ $# == 1 ];then
	cheng
	elif [ $# == 2 ];then
	zhi
	else 
 	echo " command error "
 	fi

7.变量的作用域

1)全局变量:任何地方都生效的变量,默认情况下,脚本主体内定义全局变量,函数内可以用,函数外也可以用

#!/bin/bash

function db1() {
    value=$[ $value * 2 ]
}

read -p "Enter a value:" value
db1
echo "The new value is:" $value

默认情况下都是全局变量
2)局部变量:
定义方法: local value

#!/bin/bash

function fun1() {
    local temp=$[ $value + 5 ]
    result=$[ $temp * 2 ]
}

temp=4
value=6

fun1

echo "The result is $result"
if [ $temp -gt $value ];then
    echo "temp is larger"
else
    echo "temp is smaller"
fi

如果这里的temp没有定义为局部变量,那么输出就会变成 temp is larger

8.函数递归
计算阶乘

1)使用for循环

#!/bin/bash

read -p "Num:" num

result=1
for i in `seq $num`
do
    result=$[ $result * $i ]
done

echo "The result is:" $result

2)使用函数嵌套

#!/bin/bash

function jc() {
    if [ $1 -eq 1 ];then
        echo 1
    else
        local temp=$[ $1 - 1 ]
        local result=`jc $temp`
        echo $[ $result * $1 ]
    fi
}

read -p "Enter a value:" value
result=`jc $value`
echo "The jc of $value is: $result"

这个确实比较难想,加紧学习~

猜你喜欢

转载自blog.csdn.net/weixin_40543283/article/details/85546544
今日推荐