Подстановка файлов и совпадение только с номерами

В скрипте bash мне нужно убедиться, что пользователь вводит действительные числа, поэтому я подумал, что самый простой способ убедиться в этом - реализовать case:

case $1 in
    [0-9]*)
    echo "It's ok"
    ;;
    *)
    echo "Ain't good!"
    exit 1
    ;;
esac 

Но мне тяжело работать с глобализацией файлов, потому что я не могу найти способ требовать, чтобы значение в $1 было только числовым. Или другой способ мог бы исключить все альтернативы:

case $1 in
    -*)
    echo "Can't be negative"
    exit 1
    ;;
    +*)
    echo "Must be unsigned"
    exit 1
    ;;
    *[a-zA-z]*)
    echo "Can't contain letters"
    exit 1
    ;;
esac

Дело в том, что в этом случае я должен иметь возможность блокировать "специальные" символы, как!? ^ = () и так далее... Я не знаю, как этого добиться. Пожалуйста, кто-нибудь подскажет?

2 ответа

Решение

Если вы найдете нечисловые символы где-либо в строке, ввод будет плохим, в противном случае это будет хорошо:

case "$1" in
  *[^0-9]*) echo "first parameter must contain numbers only"; exit 1;;
esac

На самом деле было бы лучше использовать

*[!0-9]*

вместо

*[^0-9]*

первый - POSIX, а второй - башизм [1].

[1] http://rgeissert.blogspot.com/2013/02/a-bashism-week-negative-matches.html

Другие вопросы по тегам