Как мне сделать, если арифметика оператора в bash?
Я хочу сделать что-то вроде этого:
if [ $1 % 4 == 0 ]; then
...
но это не работает. Что мне нужно сделать вместо этого?
Спасибо
Ответ 1
read n
if ! ((n % 4)); then
echo "$n divisible by 4."
fi
Оператор (( )) оценивает выражения как арифметику C и имеет логическое возвращение.
Следовательно, (( 0 )) является ложным, а (( 1 )) является истинным. [1]
Оператор $(( )) также расширяет C арифметические выражения, но вместо того, чтобы возвращать true/false, он возвращает значение вместо этого. Из-за этого вы можете проверить результат, если $(( )) следующим образом: [2]
[[ $(( n % 4 )) == 0 ]]
Но это равносильно: if (function() == false). Таким образом, более простой и более идиоматический тест:
! (( n % 4 ))
[1]: Современный bash обрабатывает номера до вашего размера intmax_t.
[2]: Обратите внимание, что вы можете отбросить $ внутри (( )), потому что в нем есть переменные разметки.
Ответ 2
одиночные скобки ([..]) не работают для некоторых тестов, попробуйте использовать двойные скобки ([[...]]) и приложите mod в ((..)), чтобы правильно оценить оператор %: