【问题标题】:Code in bash creates infinite loops when checking two conditionsbash 中的代码在检查两个条件时会创建无限循环
【发布时间】:2021-05-10 04:06:27
【问题描述】:

所以我对 bash 非常陌生,并且仍在尝试了解它的基础知识。目前我正在开发一个简单的照片管理器脚本,它会要求用户输入一个数字,然后创建一个名为 pic.photo 的文件。但是,在创建文件之前,必须满足两个条件; 1. 编号必须在 1 到 99999 的范围内,以及 2. 文件必须不存在。下面是我的代码。

while [[ true ]]; do

    while [[ true ]]; do
        read -p "Enter Photo Number: " photoNum
        if [[ $photoNum -ge 1 && $photoNum -le 99999 ]]; then break; fi
            echo "Photo Number is not in the range 1 to 99999";   
        done

    fileNum=p${photoNum}.photo

    while [[ true ]]; do
        if [[ -f "$fileNum" ]]; then break; fi
            echo "p$photoNum.photo already exists"; 
        done
done

touch data/p$photoNum.photo 

如果有人可以提供反馈,将不胜感激。

【问题讨论】:

    标签: bash file while-loop user-input infinite-loop


    【解决方案1】:

    需要改进的地方:

    1. 测试是否存在正确的文件。测试检查 即使您将它们放在当前目录中 “数据”目录。
    2. 在将变量括在大括号中时要保持一致。建议您包装所有变量以避免意外 扩展。并且它也使得使用参数扩展变得容易 操作。
    3. 我认为控制结构需要更简单。不仅要 使其更具可读性,但使其易于理解。嵌套的 While 循环所做的一切都可以通过 一个循环和正确的 if-then 语句。
    4. touch 命令永远不会到达,因为它在循环之外。
    5. 您可以通过提出明确的问题并发布错误(在这种情况下,发布您的循环卡住的行)来改进您的问题。

    如果条件不满足,以下代码会修改停止程序的行为。现在要求用户立即输入一个新数字。我这样做是基于您想要为此目的使用 while 循环的解释。否则,几乎没有理由使用 while 语句。

    #!/bin/bash
    #set -x
    
    while [[ true ]]; do
            read -p "Enter Photo Number: " photoNum
            if ! [[ ${photoNum} -ge 1 && ${photoNum} -le 99999 ]]; then
                echo "Photo Number is not in the range 1 to 99999"
                continue
            fi
            fileNum=p${photoNum}.photo
            if [[ -f data/"${fileNum}" ]]; then
                echo "p${photoNum}.photo already exists"
                continue
            else
                touch data/p${photoNum}.photo
            fi
    done
    

    作为最后一个提示,如果您想在运行时查看幕后情况,请在解释器行下方的代码中使用 set -x。从提供的代码中取消注释第二行以尝试一下。

    【讨论】:

      猜你喜欢
      • 2013-02-09
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 2020-03-19
      • 2016-04-05
      • 1970-01-01
      相关资源
      最近更新 更多