Bash参数解析逻辑陷入无限循环[重复]

Posted

技术标签:

【中文标题】Bash参数解析逻辑陷入无限循环[重复]【英文标题】:Bash arguments parse logic runs into infinite loop [duplicate] 【发布时间】:2017-06-02 04:58:02 【问题描述】:

我有一个循环来解析命令行参数。如果 -d 或 -b 参数有参数,一切正常。但是当我在没有参数的情况下传递 -d 或 -b 时,脚本会进入无限循环。

# Parse command line input
while [ "$#" -gt 0 ]; do
  case "$1" in
    -d) DOMAIN="$2"; shift 2;;
    -b) BITS="$2"; shift 2;;
     *) die "unrecognized argument: $1"
  esac
done

如何在空参数上抛出错误?

【问题讨论】:

如果您的参数只是单个字母,您可以使用getopts 而不是自己滚动。 一个可行的技巧,特别是如果你有一些标志选项(不带参数)是shift而不是case中的shift 2,然后是另一个shift esac 和之前的 done。标志选项根本不需要转变。因为它会一次移动一个参数,所以它会摆脱一个没有参数的流浪-b,因此循环将终止。也就是说,getopts 答案是更好的长期选择。临时解决方案会遇到临时错误——见证你的无限循环问题。 【参考方案1】:

shift n 命令在您尝试移动的值超过列表中存在的数量时不会执行任何操作。这就是代码中出现无限循环的原因。

使用getopts 是正确的做法,因为它为您提供了很大的灵活性。否则,你可以这样重写你的循环:

#!/bin/bash
# Parse command line input
d_flag=0
b_flag=0
while [ "$#" -gt 0 ]; do
  case "$1" in
    -d) 
        d_flag=1
        shift
        [[ $1 == -* ]] && continue # argument to -d not given
        DOMAIN=$1
        shift
        ;; 
    -b) 
        b_flag=1
        shift
        [[ $1 == -* ]] && continue # argument to -b not given
        BITS=$1
        shift
        ;;
     *) echo "unrecognized argument: $1"; exit 2;;
  esac
done

if [[ $d_flag = 1 && -z $DOMAIN ]]; then
    # handle error - option requires an argument
fi

if [[ $b_flag = 1 && -z $BITS ]]; then
    # handle error - option requires an argument
fi

【讨论】:

【参考方案2】:

由于参数不足,Shift 失败。

但是,如果您将 shell 设置为在所有错误上失败(使用set -e),这个问题就会立即显现出来。在许多情况下,它通过避免静默故障使调试变得更加容易,并强制执行纪律和错误检查。 set -u 导致变量扩展失败时出错,也非常有用。

【讨论】:

【参考方案3】:

由于您似乎总是需要两个参数,您可以将第一行更改为:

while [ "$#" -eq 2 ]; do

否则你可以在进入循环之前检查 $2 的值,如下所示:

if [[ -z $2 ]]; then 
echo "missing second parameter"
else
#do the while loop
fi

【讨论】:

这只有在所有选项都带参数时才有效,因此我们可以将它们视为对。

以上是关于Bash参数解析逻辑陷入无限循环[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Java TCP Client-Server - 在两个应用程序中陷入无限循环[重复]

尝试使用 Swift 实现无限滚动时陷入无限循环

VBA excel删除无限循环

Knight's Tour 代码陷入无限循环,无法解决

蝗虫负载测试陷入无限循环

C:使用fgetc()解析文件 - EOF无限循环