【问题标题】: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】:
需要改进的地方:
- 测试是否存在正确的文件。测试检查
即使您将它们放在当前目录中
“数据”目录。
- 在将变量括在大括号中时要保持一致。建议您包装所有变量以避免意外
扩展。并且它也使得使用参数扩展变得容易
操作。
- 我认为控制结构需要更简单。不仅要
使其更具可读性,但使其易于理解。嵌套的
While 循环所做的一切都可以通过
一个循环和正确的 if-then 语句。
-
touch 命令永远不会到达,因为它在循环之外。
- 您可以通过提出明确的问题并发布错误(在这种情况下,发布您的循环卡住的行)来改进您的问题。
如果条件不满足,以下代码会修改停止程序的行为。现在要求用户立即输入一个新数字。我这样做是基于您想要为此目的使用 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。从提供的代码中取消注释第二行以尝试一下。