while 루프는 for 루프에 없는 사용자 입력을 확인합니다.

while 루프는 for 루프에 없는 사용자 입력을 확인합니다.

폴더의 파일을 나열하고 사용자의 입력을 받아 파일 중 하나를 선택합니다.

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 ))

나는 $i를 나타내기 위해 []를 사용하거나 사용하지 않는 등 및 유사한 다른 조합을 사용해 =~본 적이 없습니다 . 아무것도 작동하지 않는 것 같습니다.!=! $input == $i

사용자가 $i 범위에서 유효한 입력을 제공할 때까지 while 루프를 실행하는 방법입니다.

답변1

(모바일이라 생각보다 짧네요)

=~정규식 일치입니다. 당신은 이것을 원하지 않습니다. 대신 -lt(보다 작음) 또는 -le(작거나 같음)을 사용하세요 .

코드에 다른 많은 문제가 있습니다

  • 파일 그룹을 나열 하는 데 사용하지 말고 ls파일 그룹을 직접 사용하십시오.files=(~/VideoExtract/*.avi)
  • 변수 사용시 참조변수file["$i"]="$j"
  • $files반복 중에 쉘 제어 확장을 허용하십시오.for j in "${files[@]}"
  • 반드시 필요한 것은 아니지만 코드 블록을 들여쓰기하면 코드를 더 쉽게 읽을 수 있습니다.

관련 정보