フォルダ内のファイルを一覧表示し、ユーザーの入力を受けてファイルの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[@]}"
- 必ずしも必要ではありませんが、コードブロックをインデントすると、コードを読みやすくなります。