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 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的值。