Skip to main content

如何将参数传递给Bash脚本

命令行BASH的基本操作 [LinuxCast视频教程] (六月 2025)

命令行BASH的基本操作 [LinuxCast视频教程] (六月 2025)
Anonim

您可以编写一个bash脚本,以便它接收从命令行调用脚本时指定的参数。当脚本必须根据输入参数(参数)的值执行稍微不同的功能时,使用此方法。

例如,您可能有一个名为“stats.sh”的脚本,该脚本对文件执行特定操作,例如计算其单词。如果您希望能够在许多文件上使用该脚本,最好将文件名作为参数传递,以便您可以对要处理的所有文件使用相同的脚本。例如,如果要处理的文件的名称是“songlist”,则应输入以下命令行:

sh stats.sh歌曲列表

使用变量$ 1,$ 2,$ 3等在脚本内访问参数,其中$ 1表示第一个参数,$ 2表示第二个参数,依此类推。以下示例说明了这一点:

FILE1 = $ 1wc $ FILE1

为了便于阅读,请将具有描述性名称的变量分配给第一个参数($ 1)的值,然后在此变量($ FILE1)上调用单词计数实用程序(wc)。

如果您有可变数量的参数,则可以使用“$ @”变量,该变量是所有输入参数的数组。这意味着您可以使用for循环迭代处理每个循环,如以下示例所示:

对于“$ @”中的FILE1wc $ FILE1DONE

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

sh stats.sh songlist1 songlist2 songlist3

如果参数有空格,则需要用单引号将其括起来。例如:

sh stats.sh'songlist 1''songlist 2''songlist 3'

通常编写脚本,以便用户可以使用标志以任何顺序传入参数。使用flags方法,您还可以使一些参数可选。

假设您有一个脚本,它根据指定的参数(例如“username”,“date”和“product”)从数据库中检索信息,并以指定的“格式”生成报告。现在您要编写脚本,以便在调用脚本时传递这些参数。它可能看起来像这样:

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

Bash通过“getopts”功能启用此功能。对于上面的示例,您可以使用getopts,如下所示:

getopts u:d:p:f:选项案例“$ {option}”u)USER = $ {OPTARG} ;;d)DATE = $ {OPTARG} ;;p)PRODUCT = $ {OPTARG} ;;f)格式= $ OPTARG ;;ESACDONE

这是一个while循环,它使用“getopts”函数和一个所谓的“optstring”,在本例中是“u:d:p:f:”,来遍历参数。 while循环遍历optstring,其中包含可用于传递参数的标志,并将为该标志提供的参数值分配给变量“option”。然后case-statement将变量“option”的值赋给一个全局变量,该变量可以在读取所有参数后使用。

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

optstring开头的冒号,例如“:u:d:p:f:”,具有完全不同的含义。它允许您处理未在optstring中表示的标志。在这种情况下,“option”变量的值设置为“?”并且“OPTARG”的值设置为意外标志。允许您显示适当的错误消息,通知用户错误。

getopts会忽略不带标志的参数。如果在调用脚本时未提供optstring中指定的标志,则不会发生任何事情,除非您在代码中专门处理此情况。任何不由getops处理的参数仍然可以使用常规$ 1,$ 2等变量捕获。