如何将参数传递给Bash脚本

命令,语法和示例

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

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

sh stats.sh歌曲列表

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

FILE1 = $ 1 wc $ FILE1

为了便于阅读,请为第一个参数($ 1)的值指定一个描述性名称的变量,然后在该变量($ FILE1)上调用字数计数实用程序( wc )。

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

对于“$ @”中的FILE1,执行wc $ FILE1

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

sh stats.sh songlist1 songlist2 songlist3

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

sh stats.sh'歌曲列表1''歌曲列表2''歌曲列表3'

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

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

makereport -u jsmith -p笔记本电脑-d 10-20-2011 -f pdf

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

这是一个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中没有表示的标志。 在这种情况下,“选项”变量的值被设置为“?” 并且“OPTARG”的值被设置为意外标志。 允许您显示一条合适的错误消息,通知用户该错误。

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