Проверьте, является ли каждый аргумент целым числом в оболочке - PullRequest
0 голосов
/ 22 мая 2018

Я убивал себя из-за этого, пытаясь понять это, и я знаю, что это, вероятно, очень просто, поэтому надеюсь, что новая пара глаз может помочь.У меня есть сценарий оболочки Bourne (sh), который я пишу, и он принимает список целых чисел в качестве входных данных (и количество от 1 целого числа, в идеале я хотел бы принимать как положительные, так и отрицательные числа).Я пытаюсь сделать проверку ошибок для случая, если кто-то вводит что-то, кроме целого числа.Они могут ввести «1 2 3 4 5 a», и это выдаст ошибку, потому что a не является int.

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

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

for i in $@; do 
    if [ $i -ge 0 ] 2>/dev/null; then
        echo "Invalid input: integers only."
        exit 1
    fi 
done

Ответы [ 3 ]

0 голосов
/ 22 мая 2018

В POSIX sh вы можете сопоставить свою строку с глобусом с помощью case:

#!/bin/sh
for i
do
  case "$i" in
    *[!0-9]*)
      echo "Integers only" >&2
      exit 1
  esac
done
echo "Ok"

Вот как она работает:

$ ./myscript 1 2 3 4 5
Ok

$ ./myscript 1 2 3 4 5 a
Integers only

Проблема с вашим подходомВ первую очередь вы проверяете успех, а не неудачу: [ потерпит неудачу, если введенные данные неверны.

0 голосов
/ 22 мая 2018
#!/bin/sh
#

for i in "$@"
do 
    case "${i#[-+]}" in 
        0) 
            echo cannot be 0?
            exit 1
            ;; 
        *[!0-9]* | '')
            echo not int
            exit 2
            ;; 
    esac
done

echo i\'m ok

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

Почти дубликаты: BASH: проверьте, является ли строка допустимой как целое число? А вот хороший ответ для posix,https://stackoverflow.com/a/18620446/7714132

0 голосов
/ 22 мая 2018

Вы можете использовать регулярное выражение:

my_script.sh

for i in $@ ; do 
    if ! [[ "$i" =~ ^-?[0-9]+$ ]] ; then
        echo "Invalid input: integers only."
        exit 1
    fi
done

Пример:

$ sh my_script.sh 1 2 3 4
$ sh my_script.sh 1 2 -12
$ sh my_script.sh 1 2 -12-2
Not a number!
$ sh my_script.sh 1 2 a b
Not a number!

Объяснение регулярного выражения:

  • ^: начало строки
  • -?: 0 или 1 раз больше символа -
  • [0-9]+: 1 или более цифра
  • $: конец строки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...