📜  如何传递和解析 Linux Bash 脚本参数和参数

📅  最后修改于: 2021-10-28 03:00:58             🧑  作者: Mango

将参数解析和传递到 bash 脚本/shell 脚本中与我们将参数传递给 Bash 脚本中的函数的方式非常相似。我们将看到将参数传递给脚本的实际过程,并查看在脚本中访问这些参数的方法。

在运行之前传递参数

我们可以在运行 bash 解释器命令时在脚本名称之后传递参数。您可以将参数或参数传递给文件。只是通过将参数的值直接添加到脚本来正常运行脚本的命令。每个参数都是要传递给 shell 脚本的空格分隔值。

bash scriptname.sh 

上面的命令将只运行脚本而不传递参数。

而下面的命令会将参数传递给脚本。

bash scriptname.sh parameter1 parameter2 parameter3 nth-parameter

使用传递参数运行 bash 脚本

上面的屏幕截图显示了传递给脚本的参数,我们将如何做到这一点,我们将在下一节中解释。但是现在我们可以看到我们已经使用 bash 环境变量从脚本外部传入了参数。您甚至可以使用字符串和其他数据类型,但要注意任何空格。空格将使变量成为一个单独的参数。因此,特别是对于字符串,请注意严格用引号将它们括起来。

检测命令行参数

现在,我们将看到如何在脚本中访问这些参数。我们将使用按顺序传递的参数数量,即对于传递的第一个参数,我们将通过使用 $1 作为变量来解析(访问)参数。第一个参数存储在 $1 变量中。此外,您可以将此变量分配给您喜欢的任何其他用户定义变量。对于传递的第 n 个参数,您可以使用 $n 访问该特定参数。此处,变量名称以 1 开头,因为文件名/脚本名称是第 0 个参数。如果您有 9 个以上的参数,请确保在数字周围使用 {},因为没有括号,bash 只会将 $10 视为 $1 而排除 0,因此使用 ${10} 等等,而不是简单的 $10。

#!/bin/bash

echo "1st parameter = $1 "
echo "2nd Parameter = $2 "

上面的脚本可以使用位置参数从命令行/shell 访问参数,这些参数是 1、2、3 等。

从脚本访问参数。

如您所见,我们已使用 {} 访问从 10 起的参数变量编号。该脚本可用于循环和 while 循环来迭代参数,但我们将在后面的部分中讨论它。

将提供的参数分配给 Bash 变量

我们还可以将其分配给其他自定义变量,以使脚本更具动态性并根据需要对其进行模制。虽然上面的脚本在运行时只会打印两个参数,但您肯定可以使用变量作为参数在数字中的顺序来访问更多参数。脚本可以从命令行访问位置变量,并在脚本中需要的任何地方使用它们。

#!/bin/bash

a=$1
b=$2
p=$(($a*$b))
echo "The product of $a and $b = $p"

将提供的参数分配给 Bash 变量

上面的脚本访问位置参数,即传递给脚本的 $1 和 $2 并存储用户定义的变量,以便以后访问它们并相应地修改它们。我们还可以使用迭代方法访问更多参数,我们将在接下来的部分中看到。

我们还可以检查使用 -z 或 -n 标志传递的任何 NULL 或空参数。由此,我们可以验证是否传递了参数。

#!/bin/bash

if [[ -z $1 ]];
then 
    echo "No parameter passed."
else
    echo "Parameter passed = $1"
fi

检查传入与否的位置参数。

使用此脚本,我们可以检测是否传入了任何位置参数或未传入任何位置参数。 -z 标志检查 BASH 中的任何 NULL 或未初始化的变量。如果传递的变量为 NULL 或未初始化,则 -z 标志返回 true。因此,我们可以利用基本的 If-else 语句来检测传递的参数。

我们也可以使用 -n 标志,如果没有传递参数,它会返回 true,所以我们必须使用 !来扭转局面。

例如如下:

#!/bin/bash

if [[ ! -n $1 ]];
then 
    echo "No parameter passed."
else
    echo "Parameter passed = $1"
fi

该脚本也将提供相同的输出,但我们使用的是 -n 标志而不是 -z。

使用 For 或 While 循环读取多个参数

我们可以使用“@”变量来访问通过命令行传递给脚本的每个参数。它是一个特殊的变量,用于保存 BASH 中的变量数组。在这种情况下,我们单独使用它,因此它包含传入的位置参数数组。我们可以使用它来迭代使用循环或 while 循环传递的参数。

#!/bin/bash

for i in $@
do 
        echo -e "$i\n"
done

使用循环和@变量来访问作为数组元素的参数。

我们使用基于范围的 for 循环进行迭代,直到 @ 数组中有元素为止。我们简单地遍历数组并打印元素。我们可以简单地分配它,修改值,并对参数和参数进行所需的更改,以从脚本中获得所需的结果。

或者

我们还可以使用 while 循环和 BASH 的环境变量打印参数。

#!/bin/bash

i=$(($#-1))
while [ $i -ge 0 ];
do
    echo ${BASH_ARGV[$i]}
    i=$((i-1))
done

使用 while 循环遍历传递的参数。

我们使用变量“ # ”,因为它保存传入参数的数量。我们初始化参数数量并取走一个,因为我们将使用数组对其进行迭代。所以,像往常一样,数组的索引从 0 开始。由于这个数组是从最后一个元素或传递的参数开始初始化的,我们需要将计数器递减到 0 以按照传递的顺序打印每个参数。我们只需使用 BASH_ARGV 数组来访问参数并打印其值。此外,在每次迭代中,我们使用算术双括号将 i- 迭代器或计数器的值减一。由此,我们只需使用 while 循环打印传递给脚本的每个参数,如输出屏幕截图所示。

使用参数名称读取

使用 getopts 解析参数和参数

我们可以使用 getopts 程序/命令通过使用循环和 switch-case 语句在命令行/终端中解析传递给脚本的参数。

#!/bin/bash

while getopts n:c: option
do 
    case "${option}"
        in
        n)nation=${OPTARG};;
        c)code=${OPTARG};;
    esac
done

echo "Nation : $nation"
echo "code   : $code"

使用 getopts 解析参数和参数

使用 getopts,我们可以将命令行中的位置参数/参数直接分配给 bash 变量。这使我们能够以系统的方式很好地管理参数。在上面的脚本中,我们使用了两个参数来使用 getopts 语法、while 循环和 switch-case 语句存储 bash 变量。

打印所有参数的值

我们可以通过一个简单的强大变量“@”打印传递给脚本的参数,该变量存储所有传递的参数。

#!/bin/bash

echo "The arguments passed in are : $@"

打印所有参数的值

访问传递的参数数量

我们还可以使用变量“#”来访问从命令行传递的参数数量。 # 变量基本上包含传递到脚本中的参数/参数的数量。

#!/bin/bash

echo "The number of arguments passed in are : $#"

访问传递的参数数量

以下是bash脚本中传递和解析变量的过程和规范。对变量进行移位和修改的逻辑掌握在用户手中。这只是将参数从命令行传入并解析到脚本以使其更具动态性的演示。