3

私はこのstackoverflowの質問を読みました...

Bash:ユーザー入力が正しいことを確認してください

これは私が望むことのほとんどを実行しますが、それが単なる整数であることを確認するのではなく、可変範囲の整数であることを確認する必要があります。

スクリプトはディレクトリ内のファイルを検索し、それらに番号を割り当てます...

  1. ファイル1
  2. ファイル2
  3. ファイル3など...

ユーザーが番号を選択すると、スクリプトはそのファイルに対してコマンドを実行します.....変数$FILELISTはファイルの総数です。

私が試した前のstackoverflowの例をとって.....

FILENUM=""
while [[ ! ($FILENUM =~ ^[0-$FILELIST]+$) ]]; do
    echo " "
    echo "Please enter the file number: "
    read -p "1 - $FILELIST" FILENUM < /dev/tty
done

echo "$FILENUM"

ただし、これは構文エラーをスローします。while行に予期しない "(​​"( "do"を期待))があり、その理由はわかりません。$ FILELISTを何らかの方法で括弧で囲む必要があると思いますが、上記の機能が役立つ理由についての説明が役立ちます。私は問題を理解しています。

ありがとう

4

1 に答える 1

1

bash 固有の回答:

車輪を再発明する必要はありません:selectビルトインを使用してください:

cd /path/to/directory
PS3="Select a file: "
select file in *; do
    if [[ $file ]]; then break; fi
done
echo "You selected '$file'"
echo "You selected file number $REPLY"

数値が特定の範囲内にあることを確認するには、次のように記述します。

if (( 0 <= $number && $number <= $max )); then echo "in range"; fi

ash を使用しているため、これを参照として使用できます: http://manpages.debian.net/cgi-bin/man.cgi?query=dash

while true; do
    FILENUM=""
    echo 
    echo "Please enter the file number: "
    read -p "1 - $FILELIST" FILENUM < /dev/tty
    if expr "$FILENUM" : '[0-9]\+$' &&
       [ $FILENUM -gt 0 ] && 
       [ $FILENUM -le $FILELIST ]
    then
        break
    fi
done
echo "$FILENUM"
于 2013-02-26T02:28:53.450 に答える