Shell编程之函数

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

从文件中调用

可将函数定义存储在一个单独的文件中,然后在需要使用这些函数的脚本中引用该文件。

  1. 创建包含函数定义的文件
#functions.sh
greet() {
    echo "Hello, $1!"
}
add() {
    echo $(( $1 + $2 ))
}
check_even() {
    if [ $(($1 % 2)) -eq 0 ]; then
        echo "$1 是偶数"
    else
        echo "$1 是奇数"
    fi
}
  1. 在主脚本中引用函数文件

使用 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、函数返回值

  1. 返回状态码

通过 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
  1. 返回计算结果或字符串

通过 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、数组变量和函数

定义和使用数组

  1. 定义数组
#使用括号定义数组
my_array=(value1 value2 value3)
#使用单个元素的索引来定义数组
my_array[0]=value1
my_array[1]=value2
my_array[2]=value3
  1. 访问数组元素
#访问单个元素echo ${my_array[0]}  # 输出 value1,索引从0开始
#访问所有元素echo ${my_array[@]}  # 输出 value1 value2 value3
  1. 获取数组长度
echo ${#my_array[@]}  # 输出 3
  1. 遍历数组

可以使用 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
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值