在 Bash 脚本中传递参数的示例

如果我们开发了一个名为 stats.sh 的脚本来计算文件中的单词数,最好将文件名作为参数传递,以便相同的脚本可用于将要处理的所有文件。

比如要处理的文件名是songlist,在命令行输入如下:

sh stats.sh songlist

使用变量 $1、$2、$3 等在脚本内访问参数。
变量 $1 指的是第一个参数,$2 指的是第二个参数,而 $3 指的是第三个参数。
例如,在脚本中:

FILE1=
wc $FILE1

将具有描述性名称的变量分配给第一个参数 ($1) 的值,然后对变量 $FILE1 或者我们可能想要执行的任何其他操作调用字数统计实用程序 (WC)。

如果我们需要可变数量的参数,请使用 $@ 变量,它是所有输入参数的数组。
此过程使用 for 循环来迭代处理每个循环,如以下示例所示:

for FILE1 in "$@"
do
wc $FILE1
done

以下是如何使用命令行中的参数调用此脚本的示例:

sh stats.sh songlist1 songlist2 songlist3

如果参数包含空格,请用单引号将其括起来。
例如:

sh stats.sh 'songlist 1' 'songlist 2' 'songlist 3'
如何将参数传递给 Bash 脚本

冒号的含义

optstring 中的冒号表示相应标志需要值。
在上面的 u:d:p:f: 示例中,所有标志后跟一个冒号。
这意味着所有标志都需要一个值。
例如,如果不希望 d 和 f 标志具有值,则 u:dp:f 将是 optstring。

起始冒号将 getopts 置于“静默报告模式”。
不是完全错误的脚本,任何意外的参数填充?
选项,我们可以根据需要查找或者处理它。
如果 optstring 中没有初始冒号,终端会显示错误。
例如,我有上面计算单词的脚本。
它期待像“stats.sh -f 文件名”这样的语法。
没有冒号,如果我尝试“stats.sh -h”,我会得到:

stats.sh -h
stats.sh: illegal option -- h

然而,使用冒号,我可以在我的脚本中添加一行,期待类似这样的内容,例如 ?) echo "No -${OPTARG} argument found.";; .然后这允许我捕获和处理意外条目(在这种情况下通过输出我自己的错误消息)。

stats.sh -h
No -h argument found.

getopts 忽略前面没有标志的参数。
如果在调用脚本时未提供 optstring 中指定的标志,则不会发生任何事情,除非我们在代码中专门处理这种情况。
getops 未处理的任何参数仍然可以使用常规 $1、$2 和 $3 变量捕获。

标志方法

通常会编写一个脚本,以便可以使用标志以任何顺序传递参数。
使用 flags 方法,一些参数可以是可选的。

例如,编写一个脚本,根据用户名、日期和产品等指定参数从数据库中检索信息,并生成指定格式的报告。
脚本需要这样编写,以便在调用脚本时传递这些参数。
它可能看起来像这样:

makereport -u jsmith -p notebooks -d 10-20-2011 -f pdf

Bash 使用 getopts 函数启用此功能。
对于上面的例子,使用 getopts 如下:

while getopts u:d:p:f: option
do
case "${option}"
in
u) USER=${OPTARG};;
d) DATE=${OPTARG};;
p) PRODUCT=${OPTARG};;
f) FORMAT=${OPTARG};;
esac
done

这是一个 while 循环,它使用 getopts 函数和所谓的 optstring(在本例中为 u:d:p:f:)来迭代参数。
while 循环遍历 optstring,其中包含用于传递参数的标志,并将为该标志提供的参数值分配给变量选项。
case 语句然后将变量选项的值分配给一个全局变量,该变量在所有参数都已被读取后使用。

日期:2020-07-15 11:16:31 来源:oir作者:oir