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