while 循环检查用户输入不在 for 循环中

while 循环检查用户输入不在 for 循环中

我列出文件夹中的文件并接受用户的输入以选择其中一个文件。

files=$(ls ~/VideoExtract/*.avi)
i=1
for j in $files
do
echo "$i.$j"
file[i]=$j
i=$(( i + 1 ))
done
echo ""
echo ""
read -p "Enter the serial number from the above list : " input
clear

假设我有3个文件,上面的代码列出了序列号为1、2、3的所有三个文件。我想验证用户是否提供了正确的输入,并且在收到正确的输入之前不会破坏代码。为此,我在上面的代码之后使用了 while 循环

while [[ "$input" =~ ["$i"] ]]
do
echo "Please provide a serial number from the list given below."
files=$(ls ~/VideoExtract/*.avi)
i=1
for j in $files
do
echo "$i.$j"
file[i]=$j
i=$(( i + 1 ))
done
read -p "Enter the serial number from the above list : " input
done

这确实再次返回文件列表。问题是,如果我有 3 个文件,并且输入 4,则循环继续工作,但如果我提供 5,则循环中断并移至代码的下一行。不确定问题是否符合

while [[ "$input" =~ ["$i"] ]] 

或者

i=$(( i + 1 ))

我没有=~尝试使用!=and! $input == $i以及类似的其他组合,例如使用和不使用 [] 来表示 $i。似乎没什么作用。

如何运行 while 循环直到用户提供 $i 范围内的有效输入。

答案1

(在手机上,所以比我想要的要短一些)

=~是正则表达式匹配。你不想要这个。请改用-lt(小于)或-le(小于或等于)。

您的代码还存在许多其他问题

  • 不要用来ls列出一组文件,直接使用该组文件files=(~/VideoExtract/*.avi)
  • 使用变量时引用它们file["$i"]="$j"
  • 让 shell 控制$files迭代时的扩展for j in "${files[@]}"
  • 不是绝对必要的,但是缩进代码块将使代码更容易阅读

相关内容