为什么在getopts之后使用shift $((OPTIND-1))?

2023-12-26 33阅读

如果你是一个Linux系统管理员或者开发人员,那么你一定对Bash非常熟悉。Bash是一种Unix shell和命令语言,它提供了一些强大的工具来处理文件、文本和其他类型的数据。其中之一就是getopts命令,用于解析脚本中传入的选项参数。

为什么在getopts之后使用shift $((OPTIND-1))?

但是,在使用getopts时,有些人可能会遇到一个问题:当输入多个选项参数时,只有第一个被正确解析了,而其他的却无法识别。这时候就需要使用shift $((OPTIND-1))指令来移动位置参数。

那么为什么要这样做呢?原因很简单:getopts只能解析当前位置参数,并将下一个未知选项留给下次循环处理。换句话说,在每次循环结束后,getopts都会使$OPTIND自增1以跳过已经处理过的选项,并将其设置为下一个待处理选项所在位置。

因此,在while循环中进行完所有操作后,我们需要手动将$OPTIND重置回2(即第二个位置参数),然后再通过shift指令移除已经处理过的所有选项及其值。这样可以确保接下来的程序不会误认为剩余部分还包含前面已经解析过的选项。

下面是一个示例脚本,演示了如何在getopts之后使用shift $((OPTIND-1))指令:

```bash

#!/bin/bash

while getopts ":a:b:c:" opt; do

case $opt in

a) arg_a="$OPTARG"

;;

b) arg_b="$OPTARG"

c) arg_c="$OPTARG"

\?) echo "Invalid option -$OPTARG" >&2

exit 1

esac

done

# 移除已处理参数并将位置指针重置到第二个参数位置

shift $((OPTIND-1))

OPTIND=2

echo "arg_a=$arg_a, arg_b=$arg_b, arg_c=$arg_c"

# 处理剩余的无关参数

for i in "$@"; do

echo "Extra parameter: $i"

done

```

以上代码中,在while循环结束后,我们通过shift和$((OPTIND-1))移除了所有已经解析过的选项。然后,我们手动将$OPTIND设置为2,并开始处理剩余的未知参数。

总结一下:当你需要在Bash脚本中使用getopts命令来解析多个选项时,请记得在循环结束后使用shift和$((OPTIND-1))来移除所有已经解析过的选项及其值,并将位置指针重置回第二个参数位置。这样可以确保接下来程序不会误认为剩余部分还包含前面已经解析过的选项。

文章版权声明:除非注明,否则均为游侠云资讯原创文章,转载或复制请以超链接形式并注明出处。

目录[+]