Получите целое число потолка от числа в Linux (Bash)

Моя проблема заключалась в том, что document.createElement заменяли некоторые (глючные) инъецированные антифишинговые JS, о которых я не знал. Проблема с тем, что JS выходит за рамки этого вопроса, но советы по отладке, приведенные в комментариях к этому вопросу, были ценными для его отслеживания:

  1. Тот факт, что document.createElement находился в тени, был обнаружен отмечая, что document.hasOwnProperty('createElement') вернул true.
  2. Определение функции установки для document.createElement, которая запускает отладчик, помогло мне отследить нарушающий код. Для этой цели я использовал фрагмент break-on-access , но также см. Простой код в в этом комментарии выше для альтернативы «брось себе».

40
задан Steven Penny 18 May 2014 в 18:22
поделиться

4 ответа

Вызов языка сценариев с помощью функции ceil. Учитывая $NUMBER:

python -c "from math import ceil; print ceil($NUMBER/500.0)"

или

perl -w -e "use POSIX; print ceil($NUMBER/500.0), qq{\n}"
16
ответ дан 27 November 2019 в 01:11
поделиться

Если Вы уже знакомы с библиотекой Python, то вместо того, чтобы учиться bc, Вы могли бы хотеть определить эту функцию удара:

pc () { pyexpr="from math import *; print($@)"; python -c "$pyexpr"; }

Затем:

pc "ceil(3/4)"
1

, но также и любые допустимые работы выражения python :

pc pi / 4
0.7853981633974483

pc "'\n'.join(['Pythagoras said that %3.2f^2 + %3.2f^2 is always %3.2f'
    % (sin(ai), cos(ai), sin(ai)**2 + cos(ai)**2)
    for ai in [pi / 4 * k for k in range(8)]])"
Pythagoras said that 0.00^2 + 1.00^2 is always 1.00
Pythagoras said that 0.71^2 + 0.71^2 is always 1.00
Pythagoras said that 1.00^2 + 0.00^2 is always 1.00
Pythagoras said that 0.71^2 + -0.71^2 is always 1.00
Pythagoras said that 0.00^2 + -1.00^2 is always 1.00
Pythagoras said that -0.71^2 + -0.71^2 is always 1.00
Pythagoras said that -1.00^2 + -0.00^2 is always 1.00
Pythagoras said that -0.71^2 + 0.71^2 is always 1.00
0
ответ дан 27 November 2019 в 01:11
поделиться

Вот решение с использованием bc (который должен быть установлен практически везде):

ceiling_divide() {
  ceiling_result=`echo "($1 + $2 - 1)/$2" | bc`
}

Вот еще чисто на bash:

# Call it with two numbers.
# It has no error checking.
# It places the result in a global since return() will sometimes truncate at 255.

# Short form from comments (thanks: Jonathan Leffler)
ceiling_divide() {
  ceiling_result=$((($1+$2-1)/$2))
}

# Long drawn out form.
ceiling_divide() {
  # Normal integer divide.
  ceiling_result=$(($1/$2))
  # If there is any remainder...
  if [ $(($1%$2)) -gt 0 ]; then
    # rount up to the next integer
    ceiling_result=$((ceiling_result + 1))
  fi
  # debugging
  # echo $ceiling_result
}
7
ответ дан 27 November 2019 в 01:11
поделиться

Вы можете использовать awk

#!/bin/bash
number="$1"
divisor="$2"
ceiling() {
  awk -vnumber="$number" -vdiv="$divisor" '
  function ceiling(x){return x%1 ? int(x)+1 : x}
  BEGIN{ print ceiling(number/div) }'
}
ceiling

output

$ ./shell.sh 1.234 500
1

Или, если есть выбор, вы можете использовать лучшую оболочку, которая с плавающей точкой, например Zsh

integer ceiling_result
ceiling_divide() {
  ceiling_result=$(($1/$2))
  echo $((ceiling_result+1))
}

ceiling_divide 1.234 500
5
ответ дан 27 November 2019 в 01:11
поделиться