如何在Shell脚本中传递一个命名参数?

1,729 阅读5分钟

Linux中的shell脚本允许你编写带有硬编码值的程序和可以在运行时接受用户输入的程序。这些用户输入被称为参数或论据。我们所有的人一般都熟悉向shell脚本传递普通参数。然而,你有时可能会觉得需要向你的shell脚本传递 "命名参数"。这篇文章将引导你了解什么是命名参数以及它们在shell脚本中的必要性。之后,我们将分享一个在Ubuntu 20.04中向shell脚本传递命名参数的广泛例子。

Ubuntu 20.04中Shell脚本中的命名参数

现在,我们清楚地了解到,在Ubuntu 20.04中,我们可以很容易地编写这样的shell脚本,它能够在终端执行这些脚本时从用户那里获取参数作为输入。然而,一种不同类型的参数被称为 "命名参数",也通常在shell脚本中使用。一个命名的参数是由 "名-值 "对来象征的。这个 "名-值 "对是在shell脚本中定义的,相应的参数在执行脚本时的传递方式与你传递普通参数的方式相同。

那么在shell脚本中使用命名参数的意义是什么呢?嗯,有时候,你在你的shell脚本中定义了参数,但在运行这些脚本时,你可能不一定需要提供所有的参数。命名参数允许你在运行脚本时跳过这些参数的值,只要你想。在这种情况下,如果你使用普通的参数,你的系统就会出现错误信息,如果你在脚本中跳过任何预先定义的参数,就不会允许你继续执行你的脚本。

此外,有时你也可能在运行shell脚本时改变参数的传递顺序,也就是说,你以随机的顺序传递参数,而不是按照在shell脚本中声明变量的顺序。而另一方面,如果你在这种情况下使用普通的参数,那么同样会因为没有遵循正确的参数顺序而产生一个错误信息。因此,你可以说,命名参数在提供输入时为用户提供了更多的灵活性,而不是限制他们。

现在,当你意识到在shell脚本中使用命名参数的重要性时,让我们看看我们如何在Ubuntu 20.04系统的shell脚本中使用这些参数。

在Ubuntu 20.04系统中向shell脚本传递命名参数的例子

为了在Ubuntu 20.04中向shell脚本传递命名参数,我们设计了一个shell脚本,如下图所示。我们将在本节中用不同的参数或输入值来执行这个shell脚本。

在这个shell脚本中,我们在shell的while循环中使用了内置的 "getopts "函数。这个函数基本上从用户那里获取命名的参数作为输入。然后,我们定义了三种不同的情况,即 "n、a和g",分别对应于我们的变量 "姓名、年龄和性别"。这些案例是针对 "flag "变量定义的,我们的case-esac语句将在此基础上执行。在shell中的case-esac语句基本上等同于C语言中的Switch语句。然后,在case-esac块中,我们列出了之前声明的所有三种情况,即n、a和g。在每个情况下,我们都声明了一个变量,该变量相当于用户在执行脚本时提供的输入参数。每次执行这个脚本时,用户提供的每个参数都将被分配给相关的变量。然后,我们最后有三个 "echo "命令,分别用来打印姓名、年龄和性别这些变量的值。

在设计好这个脚本之后,我们将首先按照正确的顺序用正常命名的参数来执行它,如下所示。

$ bash Named.sh –n Aqsa –a 27 –g Female

这里,Named.sh代表我们的shell脚本的名称。此外,你可以从这个命令中看到,我们首先列出了标志,然后是它们各自要传递的参数。另外,你可以清楚地注意到,我们是按照我们的shell脚本中定义的参数的确切顺序来传递这些参数的。

现在,当这个shell脚本被执行时,你将能够在终端上看到分配给所有命名参数的值,如下图所示。

一旦我们按照正常的流程执行了这个脚本,我们可以做一个小实验,用同样的输入值但以稍微不同的顺序来执行这个shell脚本,如下面的命令所示。

$ bash Named.sh –n Aqsa –g Female –a 27

你可以看到在这个命令中,我们改变了性别和年龄参数的顺序,与最初在shell脚本中定义的顺序不同。现在,我们将尝试找出这些值是否正确分配给我们的命名参数。

当这个命令被执行时,你将能够从它的输出中看到,无论在执行shell脚本时参数的传递顺序如何,它们仍然会被分配到正确的变量中,如下图所示。

在某些情况下,用户可能不想暴露自己的年龄。在这种情况下,他/她将以如下方式执行这个shell脚本。

$ bash Named.sh –n Aqsa –g Female

在这个shell脚本的输出中,当它以上述参数执行时,你可以清楚地看到我们的系统没有产生任何错误信息;相反,它以所提供的参数顺利地执行了我们的脚本,而将Age变量留空。

以同样的方式,你也可以尝试跳过性别变量,而只提供姓名变量的值,方法如下。

$ bash Named.sh –n Aqsa

这个命令的相应输出显示在下面的图片中。

最后,我们将尝试在不提供任何参数的情况下执行这个脚本,方法如下。

$ bash Named.sh

同样,你可以从下面的输出中看到,没有错误信息产生;相反,我们的脚本在没有提供任何参数的情况下也已经成功执行了。

总结

从本教程所讨论的详细例子中,我们可以得出结论:无论向shell脚本提供的命名参数的顺序如何,它都会被成功执行。此外,即使你不给你的脚本提供任何参数,它仍然可以在没有任何错误的情况下被执行。然而,在传递命名参数时,你唯一需要注意的是,在执行你的shell脚本时,要使用正确的标志和相应的值。