Shell 函数

ShellBeginner
立即练习

介绍

在本实验中,我们将探索 Linux 中的 Shell 函数。Shell 函数是可重用的代码块,用于执行特定任务,使我们的脚本更加条理清晰且高效。我们将学习如何在 Shell 脚本中创建、调用以及使用带有参数的函数。本实验专为初学者设计,因此我们将循序渐进,并对每个概念进行详尽的解释。

这是一个引导实验,提供了逐步指导来帮助你学习和练习。请仔细遵循指令完成每个步骤并获得实践经验。历史数据表明,这是一个初学者级别的实验,完成率为 97%。它获得了学习者 100% 的好评率。

创建你的第一个 Shell 函数

让我们从创建一个简单的 Shell 函数开始。Shell 函数就像是大型脚本中的小型脚本,允许你将执行特定任务的命令组合在一起。

首先,我们需要创建一个新文件。打开终端并输入:

cd ~/project
touch functions.sh

该命令会切换到 project 目录并创建一个名为 functions.sh 的新文件。这个文件将包含我们的 Shell 函数。

现在,让我们添加第一个函数:

#!/bin/bash

## 这是一个简单的函数
greet() {
  echo "Hello, World!"
}

## 这一行调用(运行)该函数
greet

让我们来分析一下这段代码:

  • 第一行 #!/bin/bash 被称为 Shebang。它告诉系统使用 bash 来解释执行此脚本。
  • 我们使用 greet() { } 来定义函数。花括号之间的所有内容都属于该函数的一部分。
  • 在函数内部,我们有一个简单的 echo 命令,用于打印「Hello, World!」。
  • 最后一行 greet 调用(运行)了我们的函数。

现在,让我们为脚本添加执行权限并运行它:

chmod +x functions.sh
./functions.sh

你应该会看到:

Hello, World!

如果你没有看到这个输出,请仔细检查你在 functions.sh 文件中输入的内容是否完全正确。

带有参数的函数

既然我们已经创建了一个基础函数,现在让我们通过添加参数使其更加灵活。参数允许我们将信息传递到函数中。

再次打开 functions.sh 文件,并将内容替换为以下代码:

#!/bin/bash

## 带有参数的函数
greet() {
  echo "Hello, $1!"
}

## 带有多个参数的函数
calculate() {
  echo "The sum of $1 and $2 is $(($1 + $2))"
}

## 使用参数调用函数
greet "Alice"
calculate 5 3

让我们审视这段代码:

  • greet 函数中,$1 指代传递给函数的第一个参数。
  • calculate 函数中,$1$2 分别指代第一个和第二个参数。
  • $(($1 + $2)) 执行两个参数的算术加法。

运行脚本:

./functions.sh

你应该会看到:

Hello, Alice!
The sum of 5 and 3 is 8

如果你没有看到这个输出,请确保你已正确保存了对文件的更改。

函数的返回值

在 Shell 脚本中,函数返回数值的方式与其他编程语言不尽相同。相反,它们要么通过 echo 输出一个可以被捕获的结果,要么修改一个全局变量。让我们来探索这两种方法。

再次打开 functions.sh,并使用以下代码更新内容:

#!/bin/bash

## 通过 echo 输出结果的函数
get_square() {
  echo $(($1 * $1))
}

## 修改全局变量的函数
RESULT=0
set_global_result() {
  RESULT=$(($1 * $1))
}

## 捕获 echo 输出的结果
square_of_5=$(get_square 5)
echo "The square of 5 is $square_of_5"

## 使用函数修改全局变量
set_global_result 6
echo "The square of 6 is $RESULT"

让我们来分析一下:

  • get_square 函数使用 echo 输出结果,我们使用 $() 语法来捕获这个输出。
  • set_global_result 函数修改了全局变量 RESULT
  • 我们使用 $()get_square 的输出捕获到一个变量中。
  • 我们调用 set_global_result,它修改了 RESULT,然后我们打印出 RESULT 的值。

保存文件并运行:

./functions.sh

你应该会看到:

The square of 5 is 25
The square of 6 is 36

如果你没有看到这个输出,请仔细检查 functions.sh 文件中是否有拼写错误。

理解变量作用域

在 Shell 脚本中,变量默认是全局的。这意味着它们可以在脚本的任何地方被访问。但是,你可以使用 local 关键字来创建只能在函数内部访问的变量。这被称为局部作用域(local scope)。

让我们修改 functions.sh 文件来演示这个概念。

使用以下代码更新内容:

#!/bin/bash

## 全局变量
GLOBAL_VAR="I'm global"

## 带有局部变量的函数
demonstrate_scope() {
  local LOCAL_VAR="I'm local"
  echo "Inside function: GLOBAL_VAR = $GLOBAL_VAR"
  echo "Inside function: LOCAL_VAR = $LOCAL_VAR"
}

## 调用函数
demonstrate_scope

echo "Outside function: GLOBAL_VAR = $GLOBAL_VAR"
echo "Outside function: LOCAL_VAR = $LOCAL_VAR"

以下是脚本中发生的情况:

  • 我们定义了一个全局变量 GLOBAL_VAR
  • demonstrate_scope 函数内部,我们使用 local 关键字定义了一个局部变量 LOCAL_VAR
  • 我们在函数内部打印这两个变量。
  • 调用函数后,我们尝试在函数外部再次打印这两个变量。

保存文件并运行:

./functions.sh

你应该会看到类似这样的输出:

Inside function: GLOBAL_VAR = I'm global
Inside function: LOCAL_VAR = I'm local
Outside function: GLOBAL_VAR = I'm global
Outside function: LOCAL_VAR =

请注意,在函数外部访问时,LOCAL_VAR 是空的。这是因为局部变量只能在定义它们的函数内部访问。

高级函数 - ENGLISH_CALC

现在我们已经涵盖了 Shell 函数的基础知识,让我们创建一个名为 ENGLISH_CALC 的更高级的函数。该函数将接受三个参数:两个数字和一个操作符(plus、minus 或 times)。

将内容替换为以下代码:

#!/bin/bash

ENGLISH_CALC() {
  local num1=$1
  local operation=$2
  local num2=$3
  local result

  case $operation in
    plus)
      result=$((num1 + num2))
      echo "$num1 + $num2 = $result"
      ;;
    minus)
      result=$((num1 - num2))
      echo "$num1 - $num2 = $result"
      ;;
    times)
      result=$((num1 * num2))
      echo "$num1 * $num2 = $result"
      ;;
    *)
      echo "Invalid operation. Please use 'plus', 'minus', or 'times'."
      return 1
      ;;
  esac
}

## 测试函数
ENGLISH_CALC 3 plus 5
ENGLISH_CALC 5 minus 1
ENGLISH_CALC 4 times 6
ENGLISH_CALC 2 divide 2 ## 这应该会显示一条错误消息

让我们分析一下这个函数:

  • 我们使用 local 变量来存储输入和结果。这是避免干扰任何全局变量的良好实践。
  • 我们使用 case 语句来处理不同的操作。这类似于其他语言中的 switch 语句。
  • 对于每个有效的操作,我们执行计算并输出结果。
  • 如果提供了无效的操作,我们会输出一条错误消息并返回 1(在 Shell 脚本中,非零返回值表示错误)。
  • 最后,我们使用各种输入测试函数,包括一个无效的操作。

保存文件并运行:

./functions.sh

你应该会看到以下输出:

3 + 5 = 8
5 - 1 = 4
4 * 6 = 24
Invalid operation. Please use 'plus', 'minus', or 'times'.

如果你没有看到这个输出,请检查 functions.sh 文件中是否有拼写错误。

总结

在本实验中,我们探索了 Linux 中的 Shell 函数,从基础知识开始,逐步深入到更高级的概念。我们学习了如何:

  1. 创建并调用简单函数
  2. 使用函数参数
  3. 使用 echo 和全局变量从函数返回值
  4. 理解变量作用域并使用局部变量
  5. 创建一个处理算术运算的复杂函数

Shell 函数是强大的工具,可以帮助你编写更有条理、更高效且可重用的代码。它们允许你将复杂的脚本分解为更小、易于管理的部分,使你的脚本更易于理解和维护。

通过掌握 Shell 函数,你将能够编写更复杂的 Shell 脚本,并在 Linux 环境中更有效地自动化复杂任务。记住,实践是熟练掌握 Shell 脚本的关键。尝试修改我们创建的函数,或者创建你自己的函数来解决你在 Linux 工作中遇到的特定问题。