【shell脚本百炼成魔】shell脚本之函数实战

前言

在这里插入图片描述

函数的概念

在Shell脚本中,函数是一种将一系列命令和逻辑封装起来以便重复使用的方式。

函数的基本语法

在Shell脚本中,可以使用如下方法来定义函数:

1.使用关键字 function:

function function_name {
# 函数体
}

这种方式是较为传统的函数定义方式,在大多数的Shell环境中都被支持。

2.直接使用函数名和大括号:

function_name {
# 函数体
}

这种方式是较为简洁的函数定义方式,不需要使用关键字 function,直接将函数名与大括号括起来即可。

函数的简单案例

案例一,欢迎函数

# 使用关键字 function
function greet {
    
    
    echo "Hello, $1!"
}

# 使用直接定义函数名和大括号
bye() {
    
    
    echo "Goodbye, $1!"
}

$1是一个位置变量。

执行结果:

./greeting.sh itlaoxin

案例二:购物清单


[root@laoxin21 test]# cat list.sh 
#!/bin/bash
list(){
    
    
        cat <<END
        1.apple
        2.banana
        3.pear
        4.orange
        
        please slect one that you like:
END
}
list
[root@laoxin21 test]# 
root@laoxin21 test]# bash list.sh 
        1.apple
        2.banana
        3.pear
        4.orange
        
        please slect one that you like:

函数的传参

函数的传参有以下几种形式:

  • 位置参数
  • 命令替换
  • 数组参数

1. 位置参数

位置参数:使用位置参数传递参数给函数。位置参数是通过数字 $1、$2、$3 等来引用的,分别表示传递给函数的第一个参数、第二个参数、第三个参数,以此类推

#!/bin/bash

greet() {
    
    
    echo "Hello, $1! Your age is $2."
}

greet "John" 25

2. 命令替换

命令替换:使用命令替换语法 $() 或 反引号 ````来传递命令的输出作为参数

#!/bin/bash

greet() {
    
    
    echo "Hello, $(whoami)!"
}

greet

这里的$(whoami) 获取当前用户,并通过echo输出问候语

3. 数组参数

把数组作为参数传递给函数

#!/bin/bash

print_array() {
    
    
    local arr=("$@")  # 将所有参数赋值给数组变量 arr
    for element in "${arr[@]}"; do
        echo "$element"
    done
}

my_array=("apple" "banana" "cherry")
print_array "${my_array[@]}"

print_array函数接受一个数组参数,并使用 for 循环遍历该数组并输出每个元素。
在使用数组参数时,需要使用 "${array[@]}" 来传递数组的所有元素。

函数的返回值

一般shell脚本的返回值用return

1. 判断函数的执行结果

通过返回值可以判断函数的执行情况。一般约定,返回值为 0 表示函数执行成功,非零值表示函数执行失败或存在错误

#!/bin/bash

is_file_exists() {
    
    
    local file="$1"
    if [ -f "$file" ]; then
        return 0  # 文件存在,返回成功
    else
        return 1  # 文件不存在,返回失败
    fi
}

check_file() {
    
    
    local file_name="$1"
    is_file_exists "$file_name"
    if [ $? -eq 0 ]; then
        echo "File exists."
    else
        echo "File does not exist."
    fi
}

check_file "example.txt"

2. 函数的结果赋值给变量

有时候,函数需要返回一些计算结果、状态信息等。通过将函数的返回值赋值给变量,可以方便地在脚本中后续使用这些结果。

#!/bin/bash

calculate_sum() {
    
    
    local num1=$1
    local num2=$2
    local sum=$((num1 + num2))
    return $sum
}

result=0
calculate_sum 5 10
result=$?
echo "Sum: $result"

calculate_sum函数计算两个数的和,并通过 return 返回结果。

3. 作为其他函数的输入

函数的返回值可以作为其他函数的输入参数,实现不同函数之间的数据传递和协作

#!/bin/bash

get_full_name() {
    
    
    local first_name="$1"
    local last_name="$2"
    local full_name="$first_name $last_name"
    echo "$full_name"
}

greet() {
    
    
    local name="$1"
    echo "Hello, $name!"
}

first_name="John"
last_name="Doe"
full_name=$(get_full_name "$first_name" "$last_name")
greet "$full_name"

get_full_name 函数接受名字的姓和名作为参数,并返回完整的名字。然后,我们将函数的返回值赋值给变量 full_name,并将其作为参数传递给 greet 函数,实现对完整名字的问候。

shell脚本函数的作用域

函数内部的变量具有局部作用域,意味着它们在函数外部是不可见的。这是由Shell解释器的作用域规则决定的

1. 局部变量

局部变量:在函数内部声明的变量默认是局部变量,意味着它们只在函数内部可见和使用。这样的变量不能被函数外的代码访问

#!/bin/bash

my_function() {
    
    
    local my_var="Hello"
    echo "Inside function: $my_var"
}

my_function
echo "Outside function: $my_var"  # 输出为空,无法访问函数内部的局部变量

此处: my_var 是在函数内部使用 local 关键字声明的局部变量。它只在函数内部可见,在函数外部无法访问

2. 全局变量

全局变量:在函数内部也可以访问和修改全局变量,这些变量在脚本的任何地方都是可见和可用的。全局变量的作用域超出了函数的范围。

#!/bin/bash

global_var="Hello"  # 全局变量

my_function() {
    
    
    echo "Inside function: $global_var"
    global_var="World"  # 修改全局变量的值
}

my_function
echo "Outside function: $global_var"  # 输出 "World",函数内修改了全局变量

global_var是在函数外部定义的全局变量。函数内部可以访问和修改这个全局变量的值,并且函数执行后对全局变量的修改在函数外部是可见的。

在Shell脚本中没有块级作用域的概念。只有函数内部可以创建局部变量,而在其他地方(如if语句、for循环等)声明的变量仍然具有全局作用域。

总结: 对于需要在函数间共享数据的情况,可以使用全局变量或通过参数传递。使用local关键字可以将变量限定在函数的作用域内,避免了全局命名空间的冲突。确保在函数内外使用变量时,理解其作用域和可见性以避免意外的行为

使用函数创建自定义命令

1.创建一个Shell脚本文件,例如 welcome.sh。

2.在脚本文件中定义一个名为 welcome_message 的函数,用于输出欢迎信息。

   #!/bin/bash

   welcome_message() {
    
    
       echo "欢迎来到沐风晓月的csdn博客"
   }

3.添加可执行权限给脚本文件。

   chmod +x welcome.sh

4.将脚本文件放置在系统命令搜索路径中。

   smv welcome.sh /usr/local/bin/

5.在用户的 Shell 配置文件(例如 .bashrc 或 .bash_profile)中添加以下内容,以在用户登录时调用自定义命令。

   welcome_message

这样,在每次用户登录系统时,将自动执行 welcome_message 函数,并显示欢迎信息。

总结

以上就是shell脚本中函数实战的全部内容,如果对你有用,记得留言哦

猜你喜欢

转载自blog.csdn.net/wisdom_futrue/article/details/131451403