我列出文件夹中的文件并接受用户的输入以选择其中一个文件。
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[@]}"
- 不是绝对必要的,但是缩进代码块将使代码更容易阅读