脚本参数与选项($@、$#、getopts)
学习向脚本传递参数,并使用特殊变量和“getopts”解析命令行选项。
脚本参数与选项($@、$#、getopts) 是 CoddyKit 上的免费 Linux Command Line & Bash Scripting Mastery 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Linux Command Line & Bash Scripting Mastery 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Linux Command Line & Bash Scripting Mastery 课程共包含 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 导师)并解锁 Linux Command Line & Bash Scripting Mastery 课程的其余内容,请升级到 CoddyKit PRO。 Linux Command Line & Bash Scripting Mastery 课程共包含 4 节课。
「脚本参数与选项($@、$#、getopts)」这节课中我会学到什么?
学习向脚本传递参数,并使用特殊变量和“getopts”解析命令行选项。 你通过在浏览器中直接运行的动手代码来练习 Linux Command Line & Bash Scripting Mastery,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Linux Command Line & Bash Scripting Mastery 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Linux Command Line & Bash Scripting Mastery 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「脚本参数与选项($@、$#、getopts)」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Linux Command Line & Bash Scripting Mastery 课中编写并运行代码吗?
能。每节 Linux Command Line & Bash Scripting Mastery 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 循环结构(for、while)
- Bash 脚本中的函数
- 脚本参数与选项($@、$#、getopts)
- case 语句与模式匹配