whileループはforループにないユーザー入力を確認します。

whileループはforループにないユーザー入力を確認します。

フォルダ内のファイルを一覧表示し、ユーザーの入力を受けてファイルの1つを選択します。

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の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[@]}"
  • 必ずしも必要ではありませんが、コードブロックをインデントすると、コードを読みやすくなります。

おすすめ記事