我正在列出文件夹中的文件并从用户那里获取输入以选择其中一个文件。
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 范围内的有效输入。
(在手机上比我想要的要短一些)
=~
是正则表达式匹配。你不想在这里。请改用-lt
(小于)或-le
(小于或等于)。您的代码还有许多其他问题
ls
用于列出一组文件,直接使用该组文件files=(~/VideoExtract/*.avi)
file["$i"]="$j"
$files
迭代时的扩展for j in "${files[@]}"