폴더의 파일을 나열하고 사용자의 입력을 받아 파일 중 하나를 선택합니다.
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[@]}"
- 반드시 필요한 것은 아니지만 코드 블록을 들여쓰기하면 코드를 더 쉽게 읽을 수 있습니다.