bash - 第一次使用 getopts 运行脚本有效,但第二次运行它时不起作用

标签 bash shell command-line-arguments getopts

<分区>

这是我的脚本。我改编自 this tutorial所以它不可能是脚本本身的错误。 (原来的脚本也有同样的问题。)

#!/bin/bash

while getopts "a:" opt; do
  case $opt in
    a)
      echo "-a was triggered, Parameter: $OPTARG"
      ;;
  esac
done

这是我的输出:

bash-3.2$ source getopt.sh
bash-3.2$ source getopt.sh -a /dev/null
-a was triggered, Parameter: /dev/null
bash-3.2$ source getopt.sh -a /dev/null
bash-3.2$ 

我已经在互联网上进行了梳理,找不到对此行为的任何解释。

最佳答案

source 在当前 shell 的执行上下文中运行指定文件中的 bash 命令。该执行上下文包括变量 OPTINDgetopts 使用它来记住“当前”参数索引。因此,当您重复 source 脚本时,getopts 的每次调用都从上一次调用处理的最后一个参数之后的参数索引开始。

在脚本开头将 OPTIND 重置为 1,或者使用 bash getopt.sh 调用脚本。 (通常 getopts 作为通过 she-bang 执行的脚本的一部分被调用,因此它有自己的执行上下文,您不必担心它的变量。)

关于bash - 第一次使用 getopts 运行脚本有效,但第二次运行它时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48567550/

相关文章:

bash - 检查用户输入中bash脚本中的错误

bash - 使用 bash 将文件存储在 RAM 中 - 可能吗?

正则表达式使用 grep 匹配尽可能少的次数(惰性)

perl - 如何将 @ARGV 的元素分配给 $variable,然后打印它?

linux - 检查 bash 脚本中的命令行参数绕过 source 语句

shell - 从终端打开 Chrome,并打开开发者控制台

bash - 如何在 Bash 脚本中创建高效的错误检查?

linux - sort -R 命令不会在 Linux 中对行进行随机排序

linux - Bash:使用来自不同命令的模式的命令的grep结果?

linux - Kafka 服务器在按 CTRL+c 时出现故障