2013-02-26 1 views
3

я прочитал этот StackOverflow вопрос ...Баша целое и в диапазоне

Bash: check user input is correct

, который делает большую часть того, что я хочу, однако, а затем проверить это просто целое число, мне нужно проверить это целое в переменном диапазоне ....

скрипт ищет файлы в каталоге, а затем присваивает номер их ...

  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" 

Однако это бросает ошибку синтаксиса: неожиданный «(» (ожидающий «делать») в то время как линии, и я» м не знаю, почему, я подозреваю, что $ FILELIST должен быть каким-то образом в квадратные скобки, но объяснение, почему вышеупомянутые работы помогло бы мне понять проблему

Благодаря

+0

Я должен добавить это i s в оболочке busybox, так что это может быть проблемой? – user2109420

+0

Хмм, как первый комментарий, регулярное выражение '^ [0- $ FILELIST] + $', вероятно, не то, что вы хотите. Скажем, '$ FILELIST' равно 100, тогда регулярное выражение'^[0-100] + $ ', которое будет соответствовать только числам с 0 и 1 в них, в отличие от чисел от 0 до 100 ... –

+0

Я попытался изменить line, чтобы проверить переменную 0-9 (заменив $ FILELIST на 9), и она выдает ту же ошибку, поэтому я начинаю думать, может быть, это ограничение busybox? – user2109420

ответ

1

Баш конкретные ответы:.

Вам не нужно изобретать колесо: используйте 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 

С вы используете золу, вы можете использовать ее в качестве справки: 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" 
+0

К сожалению, выбор не является частью бутилинов busybox. http://www.busybox.net/downloads/BusyBox.html – user2109420