从linux中的数字中获取天花板整数(BASH)

Min*_*int 40 linux bash shell ceil

我该怎么做:

ceiling(N/500)
Run Code Online (Sandbox Code Playgroud)

N代表一个数字.

但是在一个linux Bash脚本中

Kal*_*lle 77

为何使用外部脚本语言?你默认得到楼层.要获得ceil,做

$ divide=8; by=3; let result=($divide+$by-1)/$by; echo $result
3
$ divide=9; by=3; let result=($divide+$by-1)/$by; echo $result
3
$ divide=10; by=3; let result=($divide+$by-1)/$by; echo $result
4
$ divide=11; by=3; let result=($divide+$by-1)/$by; echo $result
4
$ divide=12; by=3; let result=($divide+$by-1)/$by; echo $result
4
$ divide=13; by=3; let result=($divide+$by-1)/$by; echo $result
5
....
Run Code Online (Sandbox Code Playgroud)

考虑到负数,你可以加强一点.可能更干净的方式,但对于初学者

$ divide=-10; by=10; neg=; if [ $divide -lt 0 ]; then let divide=-$divide; neg=1; fi; let result=($divide+$by-1)/$by; if [ $neg ]; then let result=-$result; fi; echo $result
-1

$ divide=10; by=10; neg=; if [ $divide -lt 0 ]; then let divide=-$divide; neg=1; fi; let result=($divide+$by-1)/$by; if [ $neg ]; then let result=-$result; fi; echo $result
1
Run Code Online (Sandbox Code Playgroud)

  • 好的,通过解决数学特征. (3认同)
  • 不适用于负数`echo $((( - 10 + 10-1)/ 10))`给出零,而不是-1 (3认同)

小智 16

使用ceil函数调用脚本语言.鉴于$NUMBER:

python -c "from math import ceil; print ceil($NUMBER/500.0)"
Run Code Online (Sandbox Code Playgroud)

要么

perl -w -e "use POSIX; print ceil($NUMBER/500.0), qq{\n}"
Run Code Online (Sandbox Code Playgroud)

  • 请求的语言是bash,因此应该是一个不需要使用任何其他语言的bash shell脚本.我不相信这应该是最好的答案. (4认同)

Har*_*vey 7

这是一个使用bc的解决方案(应该几乎安装在任何地方):

ceiling_divide() {
  ceiling_result=`echo "($1 + $2 - 1)/$2" | bc`
}
Run Code Online (Sandbox Code Playgroud)

这是纯粹在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
}
Run Code Online (Sandbox Code Playgroud)

  • 你可以简化它来删除有条件的东西:`ceiling_result = $((($ 1 + $ 2-1)/ $ 2))` (3认同)

gho*_*g74 5

你可以使用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
Run Code Online (Sandbox Code Playgroud)

产量

$ ./shell.sh 1.234 500
1
Run Code Online (Sandbox Code Playgroud)

或者,如果有选择,您可以使用更好的shell来执行浮点运算,例如Zsh

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

ceiling_divide 1.234 500
Run Code Online (Sandbox Code Playgroud)