1. 定义函数
在shell脚本中,可以使用两种方式定义函数:
方式一:
function function_name {
# 函数体
}
方式二:
function_name() {
# 函数体
}
2、调用函数
基本调用
首先定义一个函数,然后直接通过函数名调用它:
greet() {
echo "Hello, World!"
}
#调用函数
greet
带参数调用
示例1:
定义一个带参数的函数,并在调用时传递参数:
greet() {
echo "Hello, $1!"
}
#带参数调用函数
greet "Alice"
greet "Bob"
在这个例子中,$1 引用传递给函数的第一个参数。
示例2:
创建脚本文件 function.sh,脚本中定义一个带参数的函数 Add。该函数将两个参数相加,并输出结果。
#!/bin/bash
function Add () { # 定义函数
((sum=$1+$2)) # 计算两个参数的和
echo "$1 + $2 sum is ${sum}" # 输出结果
}
Add $1 $2 # 调用函数并传递参数
在命令行执行脚本并传递参数:
bash function.sh 100 150
输出:
100 + 150 sum is 250
从文件中调用
可将函数定义存储在一个单独的文件中,然后在需要使用这些函数的脚本中引用该文件。
- 创建包含函数定义的文件
#functions.sh
greet() {
echo "Hello, $1!"
}
add() {
echo $(( $1 + $2 ))
}
check_even() {
if [ $(($1 % 2)) -eq 0 ]; then
echo "$1 是偶数"
else
echo "$1 是奇数"
fi
}
- 在主脚本中引用函数文件
使用 source 命令(或 . 命令)在主脚本中引用 functions.sh 文件。这样主脚本可以使用 functions.sh 文件中定义的所有函数。
#!/bin/bash
引用包含函数定义的文件
path=”/root/Test/functions.sh”
source $path
#使用函数
greet "Alice"sum=$(add 10 20)
echo "10 加 20 的结果是 $sum"
check_even $sum
指定文件路径后,source $path 命令会将 functions.sh 文件中的所有函数定义加载到当前的脚本环境中,使得这些函数可以在主脚本中直接使用。
3、函数返回值
- 返回状态码
通过 return 返回一个状态码(整数)。在调用函数后,可以通过 $? 获取返回值。
check_even() {
if [ $(($1 % 2)) -eq 0 ]; then
return 0 # 偶数
else
return 1 # 奇数
fi
}
#调用函数并检查返回值
check_even 4
if [ $? -eq 0 ]; then
echo "4 是偶数"else
echo "4 是奇数"fi
- 返回计算结果或字符串
通过 echo 命令返回计算结果或其他信息
add() {
echo $(( $1 + $2 ))
}
#调用函数并捕获返回值
result=$(add 3 5)
echo "3 加 5 的结果是 $result"
4、全局变量和局部变量
全局变量
全局变量是在脚本的整个生命周期中都可以访问和修改的变量。它们在函数外部定义,并在整个脚本中可见。所有函数和代码块都可以访问和修改全局变量。
#!/bin/bash
#定义全局变量
global_var="我是全局变量"
#定义一个函数print_global_var() {
echo $global_var # 访问全局变量
}
#调用函数
print_global_var
#修改全局变量
global_var="全局变量已修改"
#再次调用函数
print_global_var
运行这个脚本会输出:
复制代码
我是全局变量
全局变量已修改
局部变量
局部变量只在其定义的函数或代码块内可见。使用 local 关键字可以将变量限制在函数范围内,避免污染全局命名空间。
#!/bin/bash
#定义全局变量
global_var="我是全局变量"
#定义一个函数function with_local_var() {
local local_var="我是局部变量" # 定义局部变量
echo $local_var
echo $global_var # 仍然可以访问全局变量
}
#调用函数
with_local_var
#尝试访问局部变量(会报错或无输出)
echo $local_var
运行这个脚本会输出:
复制代码
我是局部变量
我是全局变量
5、数组变量和函数
定义和使用数组
- 定义数组
#使用括号定义数组
my_array=(value1 value2 value3)
#使用单个元素的索引来定义数组
my_array[0]=value1
my_array[1]=value2
my_array[2]=value3
- 访问数组元素
#访问单个元素echo ${my_array[0]} # 输出 value1,索引从0开始
#访问所有元素echo ${my_array[@]} # 输出 value1 value2 value3
- 获取数组长度
echo ${#my_array[@]} # 输出 3
- 遍历数组
可以使用 for 循环遍历数组中的所有元素:
for element in "${my_array[@]}"; do
echo $element
Done
数组和函数
数组可以作为参数传递给函数,也可以在函数内部定义数组并进行操作:
#!/bin/bash
print_array() {
local my_array=("$@") # 接受所有参数作为数组
for element in "${my_array[@]}"; do
echo $element
done
}
#定义一个数组
my_array=("apple" "banana" "cherry")
#调用函数并传递数组
print_array "${my_array[@]}"
从键盘传入数组参数并使用
#!/bin/bash
#定义一个函数来操作数组
modify_array() {
local array=("$@")
local new_array=()
for element in "${array[@]}"; do
new_array+=("$element modified")
done
echo "${new_array[@]}"
}
# 将输盘输入存储到数组中
read -p "请输入数组" -a numbers
# 调用函数并捕获返回的数组
modified_numbers=$(modify_array "${numbers[@]}")
# 打印修改后的数组
echo "原始数组: ${numbers[@]}"
echo "修改后的数组: ${modified_numbers[@]}"
运行这个脚本并输入一组数字
请输入数组1 2 3 4 5
输出结果如下:
原始数组: 1 2 3 4 5
修改后的数组: 1 modified 2 modified 3 modified 4 modified 5 modified
6、递归函数
一个函数可以调用另一个函数:
#定义函数function1() {
echo "这是函数1"
}
function2() {
echo "调用函数1"
function1
echo "函数1调用完毕"
}
#调用函数
function2