0

I am listing files from a folder and taking an input from the user to select one of the files.

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

Suppose if I have 3 files, the above code lists all three files listed with serial numbers 1,2,3. I want to validate if the user provides the correct input and not break the code till receiving a correct input. To do this, I have used a while loop after the above code

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

This does returns the list of files again. The problem is, if I have 3 files, and if I type 4, the loop continues to work, but if I provide 5 instead, the loop breaks and moves on to the next line of the code. I am not sure if the problem is in line

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

or

i=$(( i + 1 ))

Instead of =~ I have tried with != and ! $input == $i and similar other combinations, such as with and without [] for $i. Nothing seem to work.

How do I run the while loop till the time the user provides a valid input that is within the range of $i.

1

(On a mobile so a somewhat shorter than I'd prefer)

=~ is a Regular Expression match. You don't want this here. Use -lt (less than) or -le (less than or equal) instead.

There are also a number of other problems with your code

  • don't use ls to list a set of files, just use the set of files directly files=(~/VideoExtract/*.avi)
  • quote your variables when you use them file["$i"]="$j"
  • let the shell control the expansion of $files when you iterate over it for j in "${files[@]}"
  • not strictly necessary, but indenting your code blocks will make the code far far easier to read
  • thank you....and I will include your other suggestions as well. – Apricot Dec 6 '17 at 7:06

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.