Estou listando arquivos de uma pasta e obtendo uma entrada do usuário para selecionar um dos arquivos.
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
Suponha que se eu tiver 3 arquivos, o código acima liste todos os três arquivos listados com números de série 1,2,3. Quero validar se o usuário fornece a entrada correta e não quebrar o código até receber uma entrada correta. Para fazer isso, usei um loop while após o código acima
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
Isso retorna a lista de arquivos novamente. O problema é que, se eu tiver 3 arquivos e digitar 4, o loop continuará funcionando, mas se eu fornecer 5, o loop será interrompido e passará para a próxima linha do código. Não tenho certeza se o problema está na linha
while [[ "$input" =~ ["$i"] ]]
ou
i=$(( i + 1 ))
Em vez de =~
tentei com !=
e ! $input == $i
outras combinações semelhantes, como com e sem [] para $i. Nada parece funcionar.
Como executo o loop while até o momento em que o usuário fornece uma entrada válida que esteja dentro do intervalo de $i.
(Em um celular, um pouco mais curto do que eu preferiria)
=~
é uma correspondência de expressão regular. Você não quer isso aqui. Use-lt
(menor que) ou-le
(menor que ou igual).Há também vários outros problemas com seu código
ls
para listar um conjunto de arquivos, apenas use o conjunto de arquivos diretamentefiles=(~/VideoExtract/*.avi)
file["$i"]="$j"
$files
quando você iterar sobre elefor j in "${files[@]}"