Как решить ошибку «[: слишком много аргументов» при проверке результата деления? - PullRequest
0 голосов
/ 14 июля 2020
isDivisible(){
    if [  $number / 2 -eq 0 ]; then
       echo "$number is divisible by 2 because the remainder of $number/2 is 0"
    fi
}
./myscript.sh: line 2: [: too many arguments

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Если вы используете bash:

  • Для арифметики c используйте ((...)). Дополнительное преимущество: он позволяет использовать более естественный оператор ==, а переменные в контексте арифметики c не нуждаются в знаках доллара.
  • Использовать модуль, а не деление.
#!/bin/bash

isDivisible() {
    if ((number % 2 == 0)); then
       echo "$number is divisible by 2 because the remainder of $number/2 is 0"
    fi
}
0 голосов
/ 14 июля 2020

Команда [ не выполняет оценку общего выражения. Скорее, он оценивает только выражения горстки спецификаций c, идиосинкразии c форм, описанных в его документации . Оператор -eq входит в число поддерживаемых, а / - нет, а [ в любом случае сам не обрабатывает подвыражения.

Но любая POSIX-совместимая оболочка может вычислять арифметические c выражения с помощью расширения arithmeti c, которое вы получаете, заключив выражение, которое нужно вычислить, между $(( и )). На этом этапе, однако, важно отметить, что это даст вам целое число арифметическое c, а не арифметическое c с плавающей запятой, и в любом случае x / 2 == 0 не является подходящим тестом для определения четности x . Как отметил в своем ответе @JohnKugelman, вам нужен %, оператор модуля, а не /.

В целом, тогда:

isDivisibleBy2() {
    if [ $(( $number % 2 )) -eq 0 ]; then
       echo "$number is divisible by 2 because the remainder of $number/2 is 0"
    fi
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...