0Pricing
DevOps Bootcamp · 课时

脚本参数与选项($@、$#、getopts)

学习向脚本传递参数,并使用特殊变量和“getopts”解析命令行选项。

脚本参数与选项($@、$#、getopts) 是 CoddyKit 上的免费 DevOps Bootcamp 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 DevOps Bootcamp 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 DevOps Bootcamp 课程共包含 4 节课。

脚本参数:为什么要使用它们?

您是否使用过 ls -l 或 cp file1 file2 这样的命令?-l、file1 和 file2 都是参数!它们告诉命令要执行什么操作或作用于什么对象。

在 Bash 脚本中,参数可以让脚本更加灵活。脚本不必将值硬编码,而是可以在运行时直接从命令行接收输入。

访问位置参数

使用参数运行脚本时,Bash 会自动将这些参数分配给称为位置参数的特殊变量。

  • 第一个参数是 $1。
  • 第二个参数是 $2。
  • 依此类推,直到 $9。

对于编号超过 9 的参数,您需要使用类似 ${10}、${11} 的花括号写法,等等。这些变量保存传递给脚本的值。

演示:位置参数

让我们看看如何在脚本中访问这些参数。将此内容保存为 greet.sh,然后使用 ./greet.sh Alice Bob 运行。

#!/bin/bash

echo "Hello, $1!"
echo "Welcome, $2."
echo "The third argument (if any) is: $3"

`$0` 和 `$#`:脚本信息

Bash 还提供了一些特殊变量,用于提供有关脚本本身及其参数的信息:

  • $0:保存正在执行的脚本名称。它对于错误消息或日志记录很有用。
  • $#:包含传递给脚本的位置参数总数。

这些变量有助于让脚本更加可靠且易于用户使用。

演示:`$0` 和 `$#`

使用不同数量的参数运行此脚本,例如 ./info.sh one two three,或者直接运行 ./info.sh。

#!/bin/bash

echo "Script name: $0"
echo "Number of arguments received: $#"

`$@` 与 `$*`:所有参数

有时您需要一次引用所有参数。Bash 提供了两种方式:

  • $@:展开为相互分离的参数。使用双引号括起来时("$@"),每个参数仍然是独立的单词,即使其中包含空格也是如此。这通常是循环的首选方式。
  • $*:展开为包含所有参数的单个字符串。使用双引号括起来时("$*"),所有参数会合并为一个单词,并以 IFS 的第一个字符(内部字段分隔符,通常为空格)分隔。

遍历参数时,请始终使用 "$@",以保留其中的空格!

演示:使用 `"$@"` 循环

此脚本演示了 "$@" 如何正确处理包含空格的参数。请像这样运行:./loop_args.sh hello "world wide" web

#!/bin/bash

echo "Processing arguments with \"$@\":"
for arg in "$@"; do
  echo "  Argument: [$arg]"
done

echo "\nProcessing arguments with \"$*\":"
for arg in "$*"; do
  echo "  Argument: [$arg]"
done

选项:超越位置参数

位置参数非常适合简单场景,但如果脚本需要可选标志或命名参数,例如用于详细输出的 -v 或 -f filename,该怎么办呢?

这时就需要使用命令行选项。它们可以让脚本更加灵活、易于使用,并允许用户以任意顺序指定设置。

Bash 提供了专门用于解析这类选项的 getopts 命令。

`getopts` 语法:`optstring`

getopts 的基本语法是:getopts optstring variable。

  • optstring:由有效选项字符组成的字符串。如果选项需要参数(例如 -f filename),请在该字符后加冒号(例如 f:)。
  • variable:变量名,getopts 会将当前处理的选项字符存储在其中(例如 opt)。

getopts 还会将选项参数设置到 OPTARG 中,并将下一个参数的索引设置到 OPTIND 中。

演示:基本 `getopts`

此脚本处理 -v(详细输出)和 -f(文件)选项。请尝试运行:./options.sh -v -f mydata.txt -x 或 ./options.sh -vf mydata.txt

#!/bin/bash

while getopts "vf:" opt; do
  case $opt in
    v)
      echo "Verbose mode enabled."
      ;;
    f)
      echo "File specified: $OPTARG"
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      ;;
  esac
done

快速检查:参数变量

请思考以下脚本及其运行方式:

#!/bin/bash
echo "Script: $0"
echo "Count: $#"
for arg in "$@"; do
  echo "Arg: $arg"
done

如果运行:./myscript.sh "Hello World" 123

输出会是什么?

回顾:参数与选项

做得很好!您已经学会了如何让 Bash 脚本变得更加灵活多用:

  • 位置参数:使用 $1、$2 等直接访问参数。
  • 特殊变量:使用 $0 获取脚本名称,使用 $# 获取参数数量,并使用 "$@" 安全地遍历所有参数。
  • 命令行选项:使用 getopts 解析命名选项(例如 -v)及其参数(-f filename),让脚本更加可靠且易于用户使用。

请在自己的脚本中练习使用这些功能,构建强大而灵活的命令行工具!

常见问题解答

「脚本参数与选项($@、$#、getopts)」课时是免费的吗?

是的 — 「脚本参数与选项($@、$#、getopts)」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 DevOps Bootcamp 课程的其余内容,请升级到 CoddyKit PRO。 DevOps Bootcamp 课程共包含 4 节课。

「脚本参数与选项($@、$#、getopts)」这节课中我会学到什么?

学习向脚本传递参数,并使用特殊变量和“getopts”解析命令行选项。 你通过在浏览器中直接运行的动手代码来练习 DevOps Bootcamp,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 DevOps Bootcamp 需要有经验吗?

无需任何先前经验。CoddyKit 上的 DevOps Bootcamp 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「脚本参数与选项($@、$#、getopts)」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 DevOps Bootcamp 课中编写并运行代码吗?

能。每节 DevOps Bootcamp 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 循环结构(for、while)
  2. Bash 脚本中的函数
  3. 脚本参数与选项($@、$#、getopts)
  4. case 语句与模式匹配
← 返回 DevOps Bootcamp