bash中的代码在检查两个条件时会创建无限循环



所以我是bash的新手,仍然试图理解它的基础知识。目前,我正在一个简单的照片管理器脚本,将要求用户输入一个数字,然后创建一个文件称为图片。但是,在创建文件之前,必须满足两个条件;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 

如果有人能提供反馈,我将不胜感激。

需要改进的地方:

  1. 测试是否存在正确的文件。测试检查文件在当前目录下,即使你把它们放在"data"目录。
  2. 保持变量用花括号括起来的一致性。建议您包装所有变量,以避免意外扩张。同时也使参数展开的使用变得容易操作。
  3. 我认为控制结构需要更简单。不仅是让它更容易读,但也更容易理解。嵌套的While循环所做的事情都可以用just完成一个循环和正确的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。取消所提供代码中的第二行注释以进行测试。

最新更新