bash脚本使用return命令

return命令从函数中返回一个整数。

使用return命令有两种方式;

第一种方式是这样的:

#!/bin/bash
myfunc() {
	read -p "Enter a value: " value
	echo "adding value"
	return $(($value + 10))
}
myfunc
echo "The new value is $?"

myfunc函数将10添加到$value变量中,然后使用$?变量显示结果和。

在获取函数值之前不要执行任何命令,因为变量$?返回最后一行的状态。

这个方法返回整数,如果要返回字符串呢?

使用函数输出

从bash函数返回值的第二种方法是命令替换。

这样,我们可以从函数中返回任何内容。

#!/bin/bash
myfunc() {
	read -p "Enter a value: " value
	echo $(($value + 10))
}
result=$(myfunc)
echo "The value is $result"

bash 脚本创建函数

我们可以像这样定义函数:

functionName() {
}

要定义函数,需要括号()。

此外,我们可以使用function关键字定义函数,但为了POSIX可移植性,此关键字已弃用。
在这种定义方法中,括号不是必需的。

function functionName() {
	# Deprecated definition but still used and working
}

bash脚本传递参数

您可以使用环境变量来处理传递给函数的参数。函数名声明为$0变量,传递的参数为$1、$2、$3等。
可以使用($#)变量获取传递给函数的参数数量。

我们这样传递参数:

myfunc $val1 10 20

以下示例显示了如何使用($#)变量:

#!/bin/bash
addnum() {
	if [ $# -gt 2 ]; then
		echo "Incorrect parameters passed" # If parameters no equal 2
	else
		echo $(( + )) # Otherwise add them
	fi
}
echo -n "Adding 10 and 15: "
value=$(addnum 10 15)
echo $value
echo -n "Adding three numbers: "
value=$(addnum 10 15 20)
echo $value

如果我们尝试在函数中使用传递的参数,则会失败:

#!/bin/bash
myfunc() {
	echo $(( +  +  + ))
}
if [ $# -eq 4 ]; then
	value=$(myfunc)
	echo "Total= $value"
else
	echo "Passed parameters like this: myfunc a b c d"
fi

我们必须这样:

#!/bin/bash
myfunc() {
	echo $(( +  +  + ))
}
if [ $# -eq 4 ]; then
	value=$(myfunc    )
	echo "Total= $value"
else
	echo "Passed parameters like this: myfunc a b c d"
fi

使用bash脚本函数

#!/bin/bash
myfunc() {
	echo "Using functions"
}
total=1
while [ $total -le 3 ]; do
	myfunc
	total=$(($total + 1))
done
echo "Loop finished"
myfunc
echo "End of the script"

在这里,我们创建了一个名为myfunc的函数,并通过它的名字调用它。

我们可以根据需要多次调用该函数。

注意:如果我们尝试使用未定义的函数,将发生什么?

#!/bin/bash
total=1
while [ $total -le 3 ]; do
	myfunc
	total=$(($total + 1))
done
echo "Loop End"
myfunc() {
	echo "Using function ..."
}
echo "End of the script"

将会报错,因为没有这样的函数

另外一个需要注意的: Bash函数名称必须是唯一的。
否则,新函数将取消旧函数而不会报错。

#!/bin/bash
myfunc() {
	echo "The first function definition"
}
myfunc
function myfunc() {
	echo "The second function definition"
}
myfunc
echo "End of the script"

将数组作为参数传递

如果将数组作为参数传递给函数,会发生什么情况:

#!/bin/bash
myfunc() {
	echo "The parameters are: jack@onitroad"
	arr=
	echo "The received array is ${arr[*]}"
}
my_arr=(5 10 15)
echo "The old array is: ${my_arr[*]}"
myfunc ${my_arr[*]}

该函数仅获取数组变量的第一个值。
您应该将数组分解为单个值,然后将这些值用作函数参数。
最后,将它们打包到函数中的数组中,如下所示:

#!/bin/bash
myfunc() {
	local new_arr
	new_arr=("jack@onitroad")
	echo "Updated value is: ${new_arr[*]}"
}
my_arr=(4 5 6)
echo "Old array is ${my_arr[*]}"
myfunc ${my_arr[*]}
Bash脚本创建和使用函数

Bash函数是代码块,我们可以在代码中的任何位置重用它们。

使用命令行使用Bash函数

我们可以直接从Bash shell中使用函数。

在/ home/username编辑Bashrc文件,并添加此行:

. /home/onitroad/Desktop/myfuncs

确保路径正确。

现在直接在命令行中使用函数:

$ addnum 10 20

注意:如果函数名称和内置命令一样,则会覆盖默认命令,所以必须要小心。

bash脚本创建函数库

现在我们知道了如何编写函数以及如何调用它们,但是如果您希望在不同的bash脚本文件上使用这些bash函数或者代码块,而不是复制并粘贴到文件上,该怎么办呢。

可以为函数创建库,并根据需要从任何文件指向该库。
通过使用source命令,可以将库文件脚本嵌入shell脚本中。
source命令有一个别名,即点符号(.)。

要在shell脚本中生成文件源,请编写以下行:

. ./myscript

假设我们有一个名为myfuncs的文件,其中包含以下内容:

addnum() {
	echo $(( +  +  + ))
}

现在,我们将在另一个Bash脚本文件中使用它:

#!/bin/bash
. ./myfuncs
result=$(addnum 10 10 5 5)
echo "Total = $result"

我们在Bash脚本文件中使用了Bash函数;我们也可以直接在我们的shell中使用它们。

在Bash函数中处理变量

我们使用的每个变量都有一个范围;范围是参数对脚本的可见性。

您可以定义两种类型的变量:

  • 全局变量
  • 局部变量

全局变量

它们在bash脚本中的任何位置都可见且有效。您甚至可以从函数内部获取其值。
如果在函数中声明全局变量,则可以从函数外部获取其值。
默认情况下,您声明的任何变量都是全局变量。如果在函数外部定义变量,则在函数内部调用变量时不会出现问题:

#!/bin/bash
myfunc() {
	input=$(($input + 10))
}
read -p "Enter a number: " input
myfunc
echo "The new value is: $input"

如果修改了函数内的变量值,则该值将在函数之外也会更改。

局部变量

如果仅在函数内部使用变量,则可以使用local关键字将其声明为局部变量,如下所示:

local tmp=$(( $val + 10 ))

因此,如果有两个变量,一个在函数内部,另一个在函数外部,并且它们具有相同的名称,那么它们不会相互影响。

#!/bin/bash
myfunc() {
	local tmp=$(($val + 10))
	echo "The Temp from inside function is $tmp"
}
tmp=4
myfunc
echo "The temp from outside is $tmp"

在myfunc函数内部使用$tmp变量时,它不会更改函数外部的$tmp的值。

日期:2020-07-15 11:16:52 来源:oir作者:oir