从linux中的数字获取上限整数(BASH)

从linux中的数字获取上限整数(BASH),linux,bash,shell,ceil,Linux,Bash,Shell,Ceil,我将如何做以下事情: ceiling(N/500) N表示一个数字 但是在LinuxBash脚本中,调用带有ceil函数的脚本语言。给定的$NUMBER: python -c "from math import ceil; print ceil($NUMBER/500.0)" 或 下面是一个使用bc的解决方案(应该安装在几乎所有地方): 下面是另一个纯在bash中的示例: # Call it with two numbers. # It has no error checking. # It

我将如何做以下事情:

ceiling(N/500)
N表示一个数字


但是在LinuxBash脚本中,调用带有ceil函数的脚本语言。给定的
$NUMBER

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


下面是一个使用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
}
你可以用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
输出

$ ./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

这是一个使用Awk的简单解决方案:

如果您想要($a/$b)的ceil,请使用

还有地板的使用

echo "$a $b" | awk '{print int($1/$2)}'

请注意,我只是将被除数“$a”作为行的第一个字段与awk相呼应,将除数“$b”作为第二个字段

为什么要使用外部脚本语言?默认情况下,您将获得地板。要想得到ceil,就去做

$ divide=8; by=3; (( result=(divide+by-1)/by )); echo $result
3
$ divide=9; by=3; (( result=(divide+by-1)/by )); echo $result
3
$ divide=10; by=3; (( result=(divide+by-1)/by )); echo $result
4
$ divide=11; by=3; (( result=(divide+by-1)/by )); echo $result
4
$ divide=12; by=3; (( result=(divide+by-1)/by )); echo $result
4
$ divide=13; by=3; (( result=(divide+by-1)/by )); echo $result
5
....
把负数考虑进去,你可以把它放大一点。可能有更干净的方法,但首先

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

$ divide=10; by=10; neg=; if [ $divide -lt 0 ]; then (( divide=-divide )); neg=1; fi; (( result=(divide+by-1)/by )); if [ $neg ]; then (( result=-result )); fi; echo $result
1
(编辑后可将
let…
切换到
(…)


更简洁的Awk逻辑

awk '
function ceil(ip) {
  print ip%1 ? int(ip)+1 : ip
}  
BEGIN {
  ceil(1000/500)
  ceil(1001/500)
}
'
awk '
function ceil(ip) {
  print ip%1 ? int(ip)+1 : ip
}  
BEGIN {
  ceil(1000/500)
  ceil(1001/500)
}
'
结果

2 3 2 3 2. 3.
更简洁的Awk逻辑

awk '
function ceil(ip) {
  print ip%1 ? int(ip)+1 : ip
}  
BEGIN {
  ceil(1000/500)
  ceil(1001/500)
}
'
awk '
function ceil(ip) {
  print ip%1 ? int(ip)+1 : ip
}  
BEGIN {
  ceil(1000/500)
  ceil(1001/500)
}
'
结果

2 3 2 3 2. 3. 再展开一点,这里的算法很好地打包在一个函数中:

ceildiv(){
本地数=$1
本地分区=$2
echo$((num+div-1)/div))
}
或作为一个班轮:

ceildiv(){echo$(($1+$2-1)/$2));}
如果您想获得更多乐趣,您可以使用更强大的版本验证输入,以检查它们是否为数字,还可以处理负数:

ceildiv(){
本地num=${1:-0}
本地div=${2:-1}
如果!((div));那么
返回1
fi
如果((num>=0));则
echo$((num+div-1)/div))
其他的
echo$((((-num+div-1)/div))
fi
}
这使用了一个“假”ceil来表示负数,即最高的绝对整数,-10/3=-4,而不是应该的-3,如-3>-4。如果您想要一个“true”ceil,请在
else
之后使用
$((num/div))

然后像这样使用它:

$ ceildiv 10 3 4 $ ceildiv 501 500 2 $ ceildiv 0 3 0 $ ceildiv -10 1 -10 $ ceildiv -10 3 -4 $ceildiv 10 3 4. $ceildiv 501 500 2. $ceildiv 0 3 0 $ceildiv-10 1 -10 $ceildiv-10 3 -4
如果除法返回非浮点数,则此函数不会加1

function ceiling {
    DIVIDEND=${1}
    DIVISOR=${2}
    if [ $(( DIVIDEND % DIVISOR )) -gt 0 ]; then
            RESULT=$(( ( ( $DIVIDEND - ( $DIVIDEND % $DIVISOR ) ) / $DIVISOR ) + 1 ))
    else
            RESULT=$(( $DIVIDEND / $DIVISOR ))
    fi
    echo $RESULT
}
像这样使用它:

echo $( ceiling 100 33 )
> 4

使用华丽的“printf”将四舍五入到下一个整数

printf %.0f $float
or
printf %.0f `your calculation formula`
or
printf %.0f $(your calculation formula)

参考:

从数学上讲,天花板的功能可以用地板来定义,天花板(x)=-地板(-x)。并且,将正浮点转换为整数时,默认为下限

if [ $N -gt 0 ]; then expr 1 - $(expr $(expr 1 - $N) / 500); else expr $N / 500; fi

参考

在不指定任何函数的情况下,我们可以使用以下awk脚本:

echo x y | awk '{ r=$1 % $2; q=$1/y; if (r != 0) q=int(q+1); print q}'

不确定这一个是否有任何逻辑错误。请更正。

如果您已经熟悉Python库,那么与其学习
bc
,不如定义此bash函数:

pc(){pyexpr=“from math import*;print($@)”;python-c“$pyexpr”}
然后:

pc“ceil(3/4)”
1.
但任何有效的python表达式都可以工作:

pc-pi/4
0.7853981633974483
pc“'\n”.join(['毕达哥拉斯说%3.2f^2+%3.2f^2始终是%3.2f'
%(sin(ai)、cos(ai)、sin(ai)**2+cos(ai)**2)
适用于[pi/4*k范围内的k(8)])”
毕达哥拉斯说过0.00^2+1.00^2总是1.00
毕达哥拉斯说0.71^2+0.71^2总是1.00
毕达哥拉斯说过1.00^2+0.00^2总是1.00
毕达哥拉斯说0.71^2+-0.71^2总是1.00
毕达哥拉斯说过0.00^2+-1.00^2总是1.00
毕达哥拉斯说-0.71^2+-0.71^2总是1.00
毕达哥拉斯说过-1.00^2+-0.00^2总是1.00
毕达哥拉斯说-0.71^2+0.71^2总是1.00
如果已安装,则可以使用。它是“sed for JSON”,但我发现它对于像这样的简单任务也非常方便

示例:

$ echo 10.001 | jq '.|ceil'
11

$ jq -n '-10.001 | ceil'
-10


你可以简化它来删除有条件的东西:
ceiling\u result=$(($1+$2-1)/$2))
@1ch1g0他在Bash中说。bash中没有浮点。他的例子也显示了整数,他想要一个整数结果。无论如何,我添加了一个使用bc的解决方案。它将处理浮点数。在Perl中,您是否会使用:
ceil($ARGV[0]/$ARGV[1])
来使用这两个脚本参数?然后在脚本周围使用单引号。或者,使用双引号,您可以让shell替换它的$1、$2。当然,是的,
perl-w-e'使用POSIX;打印ceil($ARGV[0]/$ARGV[1]),qq{\n}'$n500
也可以,等等。TMTOWTDI。重要的一点是使用基于标准的ceil实现?我是新来的(哈哈,是的,你不能在评论中编写代码:(但没关系,我还是喜欢使用Python:)谢谢你的代码!请求的语言是bash,因此应该是一个bash shell脚本,不需要使用任何其他语言。我不相信这应该是最重要的答案。int(($1/$2)+1)!=ceil($1/$2)如果$1/$2是整数!这是错误的。对于没有余数的除法,您的ceil方法将返回错误的结果。例如,2/2是1(没有余数),ceil(1)应返回1。您的方法通过使用数学特征求解返回2。很好。不适用于负数
echo$(-10+10-1)/10))
给出的是零,而不是-1。添加了一个可能不理想但能解决此问题的示例。当您编写“您默认获得地板”时,您的意思是什么?您能详细说明一下吗?@colinmary Integer division为您提供地板值。请尝试echo$((7/4))Unix和Linux提供了一个Bash解决方案:虽然此代码片段可能会解决此问题,但它没有解释为什么或如何回答此问题。请包括对您的代码的解释,因为这确实有助于提高您文章的质量。请记住,您将在将来为读者回答此问题,这些人可能会回答不知道您的代码建议的原因谢谢提示!当数字是整数时不正确…楼层(500+1)=楼层(501)=501!=天花板(500)@MartinJaniczek谢谢您的观点
$ echo 10.001 | jq '.|ceil'
11

$ jq -n '-10.001 | ceil'
-10