向脚本传递参数

ShellShellBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

介绍

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


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) shell(("Shell")) -.-> shell/ControlFlowGroup(["Control Flow"]) linux(("Linux")) -.-> linux/BasicSystemCommandsGroup(["Basic System Commands"]) shell(("Shell")) -.-> shell/BasicSyntaxandStructureGroup(["Basic Syntax and Structure"]) shell(("Shell")) -.-> shell/VariableHandlingGroup(["Variable Handling"]) linux/BasicSystemCommandsGroup -.-> linux/echo("Text Display") shell/BasicSyntaxandStructureGroup -.-> shell/shebang("Shebang") shell/BasicSyntaxandStructureGroup -.-> shell/comments("Comments") shell/VariableHandlingGroup -.-> shell/variables_usage("Variable Usage") linux/BasicFileOperationsGroup -.-> linux/touch("File Creating/Updating") linux/BasicFileOperationsGroup -.-> linux/chmod("Permission Modifying") shell/ControlFlowGroup -.-> shell/if_else("If-Else Statements") shell/ControlFlowGroup -.-> shell/for_loops("For Loops") subgraph Lab Skills linux/echo -.-> lab-388811{{"向脚本传递参数"}} shell/shebang -.-> lab-388811{{"向脚本传递参数"}} shell/comments -.-> lab-388811{{"向脚本传递参数"}} shell/variables_usage -.-> lab-388811{{"向脚本传递参数"}} linux/touch -.-> lab-388811{{"向脚本传递参数"}} linux/chmod -.-> lab-388811{{"向脚本传递参数"}} shell/if_else -.-> lab-388811{{"向脚本传递参数"}} shell/for_loops -.-> lab-388811{{"向脚本传递参数"}} end

创建一个新的脚本文件

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

  1. 如果 WebIDE 尚未打开,请先打开它。
  2. 在左侧的文件资源管理器中,导航到 /home/labex/project 目录。
  3. 右键点击文件资源管理器,然后选择“新建文件”。
  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 运算符表示“等于”。还有其他运算符,例如 -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 脚本编程技能,你会发现处理命令行参数的能力对于创建多功能且可重用的脚本至关重要,这些脚本可用于系统管理和自动化中的各种任务。