向脚本传递参数

ShellBeginner
立即练习

介绍

在 Shell 编程中,向脚本传递参数是一项基础且强大的功能。它通过接受来自命令行的输入,使脚本变得更加灵活且可重用。本实验将引导你创建一个能够接受并使用命令行参数的 Shell 脚本。你将学习如何在脚本中访问这些参数、处理多个参数,以及使用特殊变量来高效地处理它们。

创建新的脚本文件

让我们从创建一个新的脚本文件开始。在本实验中,我们将使用 WebIDE (VS Code)。

  1. 如果尚未打开 WebIDE,请将其打开。
  2. 在左侧的文件资源管理器中,导航到 /home/labex/project 目录。
  3. 在文件资源管理器中右键单击并选择「新建文件」(New File)。
  4. 将新文件命名为 arguments.sh

现在我们已经创建了文件,让我们为脚本添加基本结构:

#!/bin/bash

## Your code will go here

第一行被称为「Shebang」或「Hashbang」。它告诉系统应该使用哪个解释器来执行该脚本。在这个例子中,我们使用的是 bash。

对于初学者:Shebang 行非常重要,因为它允许你直接运行脚本(例如 ./arguments.sh),而不需要每次都输入 bash arguments.sh。虽然这是一个小细节,但它能让你的脚本使用起来更加方便。

访问脚本参数

现在,让我们修改脚本以访问并显示传递给它的参数。在 Shell 脚本中,特殊变量被用来访问命令行参数:

  • $0 代表脚本本身的名称
  • $1$2$3 等,分别代表第一个、第二个、第三个参数,依此类推

将以下代码添加到你的 arguments.sh 文件中:

#!/bin/bash

echo "Script name: $0"
echo "First argument: $1"
echo "Second argument: $2"
echo "Third argument: $3"

该脚本将显示脚本名称以及传递给它的前三个参数。

对于初学者:

  • $ 符号在 bash 中用于引用变量。
  • $0$1$2 等是特殊变量,当你运行带有参数的脚本时,bash 会自动为你设置这些变量。
  • 如果你在运行脚本时不带任何参数,$1$2$3 将为空,但脚本仍会正常运行而不会报错。

使脚本可执行

在运行脚本之前,我们需要赋予它执行权限。这可以通过 chmod 命令来完成。在终端中,导航到项目目录并运行以下命令:

cd /home/labex/project
chmod +x arguments.sh

chmod +x 命令为文件添加了执行权限,使其能够作为脚本运行。

对于初学者:

  • chmod 代表「更改模式」(change mode)。它用于更改文件或目录的权限。
  • +x 选项用于添加执行权限。这是 bash 能够将文件作为脚本运行的必要条件。
  • 如果你忘记了这一步,在尝试运行脚本时会收到「权限被拒绝」(permission denied)的错误。

使用参数执行脚本

现在我们的脚本已经具备执行权限,让我们带上一些参数来运行它。在终端中执行以下命令:

./arguments.sh hello world example

你应该会看到类似下面的输出:

Script name: ./arguments.sh
First argument: hello
Second argument: world
Third argument: example

这个输出表明我们的脚本成功访问并显示了命令行参数。

对于初学者:

  • 脚本名称前的 ./ 告诉 bash 在当前目录中查找该脚本。
  • 脚本名称后的每个单词都会成为一个独立的参数。在这个例子中,「hello」是第一个参数,「world」是第二个,「example」是第三个。
  • 如果你想传递包含空格的参数,需要使用引号,例如:./arguments.sh "hello world" example

处理参数数量

让我们修改脚本以处理不同数量的参数。我们将使用 $# 特殊变量,它保存了传递给脚本的参数总数。

将你的 arguments.sh 文件更新为以下内容:

#!/bin/bash

if [ $## -eq 0 ]; then
  echo "No arguments provided."
elif [ $## -eq 1 ]; then
  echo "One argument provided: $1"
elif [ $## -eq 2 ]; then
  echo "Two arguments provided: $1 and $2"
else
  echo "More than two arguments provided:"
  echo "First argument: $1"
  echo "Second argument: $2"
  echo "Third argument: $3"
  echo "Total number of arguments: $#"
fi

该脚本使用条件语句来处理不同数量的参数。

对于初学者:

  • $# 是一个特殊变量,包含传递给脚本的参数个数。
  • [ $## -eq 0 ] 是一个检查参数数量是否等于 0 的条件。
  • elif 是「else if」的缩写。它允许你按顺序检查多个条件。
  • -eq 运算符表示「等于」(equal to)。还有其他运算符,如 -lt(小于)、-gt(大于)等。

测试更新后的脚本

现在,让我们用不同数量的参数来测试更新后的脚本:

./arguments.sh
./arguments.sh one
./arguments.sh one two
./arguments.sh one two three four

你应该会根据提供的参数数量看到不同的输出。

对于初学者:

  • 在不带任何参数的情况下运行脚本(./arguments.sh)将触发脚本中的第一个条件。
  • 随后的每个命令都增加了更多参数,展示了我们的脚本如何处理不同的情况。
  • 注意脚本的行为如何根据参数数量而变化。这种灵活性在现实世界的脚本编写中非常有用。

遍历所有参数

最后,让我们修改脚本,使用代表所有命令行参数的 $@ 特殊变量来遍历所有提供的参数。

将你的 arguments.sh 文件更新为以下内容:

#!/bin/bash

echo "Total number of arguments: $#"
echo "All arguments:"

count=1
for arg in "$@"; do
  echo "Argument $count: $arg"
  count=$((count + 1))
done

该脚本使用 for 循环来迭代所有参数,并显示它们及其对应的位置。

对于初学者:

  • $@ 是一个特殊变量,包含传递给脚本的所有参数。
  • for 循环用于遍历列表中的项。在这种情况下,它正在遍历所有的参数。
  • $((count + 1)) 是 bash 中的算术扩展。它用于递增 count 变量。
  • 这个脚本可以处理任意数量的参数,使其比我们之前的版本更加灵活。

测试最终脚本

让我们用多个参数来测试最终的脚本:

./arguments.sh apple banana cherry date

你应该会看到类似下面的输出:

Total number of arguments: 4
All arguments:
Argument 1: apple
Argument 2: banana
Argument 3: cherry
Argument 4: date

这证明了我们的脚本现在可以处理任意数量的参数并将其全部显示出来。

对于初学者:

  • 脚本的最终版本比我们之前的版本灵活得多。
  • 它可以处理从零到多个任意数量的参数。
  • 脚本现在为每个参数编号,这在更复杂的脚本中非常有用。
  • 尝试使用不同数量的参数运行脚本,观察它的表现。

总结

在本实验中,你学习了如何创建一个能够接受并处理命令行参数的 Shell 脚本。你探索了几个关键概念:

  1. 创建脚本并使其具备可执行权限。
  2. 使用特殊变量($1$2 等)访问单个参数。
  3. 使用 $# 变量确定参数的数量。
  4. 实现条件逻辑以处理不同数量的参数。
  5. 使用 $@ 变量遍历所有提供的参数。

这些技能是 Shell 脚本编写的基础,将允许你创建更灵活、更强大的脚本,以适应不同的输入。随着你继续提升 Shell 脚本编写技能,你会发现处理命令行参数的能力对于在系统管理和自动化任务中创建通用且可重用的脚本至关重要。