while loop para verificar a entrada do usuário que não está no loop

0

Estou listando arquivos de uma pasta e solicitando 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 lista todos os três arquivos listados com números de série 1,2,3. Eu quero validar se o usuário fornecer 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 se eu digitar 4, o loop continuará a funcionar, 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 e 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 dentro do intervalo de $ i.

    
por Apricot 06.12.2017 / 07:35

1 resposta

1

(Em um celular, um pouco mais curto do que eu prefiro)

=~ é uma correspondência de expressão regular. Você não quer isso aqui. Use -lt (menor que) ou -le (menor que ou igual).

Também há vários outros problemas com o seu código

  • não use ls para listar um conjunto de arquivos, apenas use o conjunto de arquivos diretamente files=(~/VideoExtract/*.avi)
  • cite suas variáveis quando você as usar file["$i"]="$j"
  • deixe o shell controlar a expansão de $files quando você iterar sobre ele for j in "${files[@]}"
  • não é estritamente necessário, mas o recuo dos blocos de código tornará o código muito mais fácil de ler
por 06.12.2017 / 07:47