从Linux中的数字获取上限整数(BASH)
我会怎么做:
ceiling(N/500)
N 代表一个数字。
但在 Linux Bash 脚本中
How would I do something like:
ceiling(N/500)
N representing a number.
But in a linux Bash script
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
为什么要使用外部脚本语言?默认情况下您获得发言权。要获得 ceil,请执行
要考虑负数,您可以稍微加强它。可能有更干净的方法,但对于初学者来说
(编辑将
let ...
切换为(( ... ))
。)Why use external script languages? You get floor by default. To get ceil, do
To take negative numbers into account you can beef it up a bit. Probably cleaner ways out there but for starters
(Edited to switch
let ...
to(( ... ))
.)使用 ceil 函数调用脚本语言。给定
$NUMBER
:或
Call out to a scripting language with a ceil function. Given
$NUMBER
:or
这是一个使用 bc 的解决方案(应该安装在几乎所有地方):
这是另一个纯粹在 bash 中的解决方案:
Here's a solution using bc (which should be installed just about everywhere):
Here's another purely in bash:
您可以使用 awk
输出
或者如果有选择,您可以使用更好的 shell
浮点数,例如 Zsh
You can use awk
output
Or if there's a choice, you can use a better shell that
does floating point, eg Zsh
稍微扩展一下 Kalle 的出色答案,这是很好地封装在函数中的算法:
或者作为一句台词:
如果您想要变得更奇特,您可以使用更强大的版本验证输入来检查它们是否是数字,还可以处理负数:
这对负数使用“假”ceil,直到最高的绝对整数,即-10 / 3 = -4,而不是应有的-3,因为-3 > -4。如果您想要一个“true”ceil,请在
else
之后使用$(( num / div ))
,然后使用它,如下所示:
Expanding a bit on Kalle's great answer, here's the algorithm nicely packed in a function:
or as a one-liner:
If you want to get fancy, you could use a more robust version validates input to check if they're numerical, also handles negative numbers:
This uses a "fake" ceil for negative numbers, to the highest absolute integer, ie, -10 / 3 = -4 and not -3 as it should, as -3 > -4. If you want a "true" ceil, use
$(( num / div ))
instead after theelse
And then use it like:
从数学上讲,天花板的函数可以用地板来定义,天花板(x)= -地板(-x)。并且,将正浮点数转换为整数时,下限是默认值。
参考号https://en.wikipedia.org/wiki/Floor_and_ceiling_functions
Mathematically, the function of ceiling can be define with floor, ceiling(x) = -floor(-x). And, floor is the default when converting a positive float to integer.
Ref. https://en.wikipedia.org/wiki/Floor_and_ceiling_functions
如果已安装,则可以使用 jq 。它是“sed for JSON”,但我发现它对于像这样的简单任务也非常方便。
示例:
You can use jq if you have it installed. It's "sed for JSON", but I find it surprisingly handy for simple tasks like this too.
Examples:
如果您有十进制数字的字符串表示形式,则
bash
确实支持使用printf
函数进行上限,如下所示:但是如果您需要使用小数进行一些数学运算,则可以使用 < code>bc -l 默认情况下缩放至 20 位小数,然后将结果与
printf
一起使用以进行四舍五入。If you have a string representation of a decimal number,
bash
does support ceiling usingprintf
function like this:But if you need to do some math using decimals, you can use
bc -l
that by default scales to 20 decimals, then use the result withprintf
to round it.这是使用 awk 的一个简单解决方案:
如果您想要使用 ($a/$b) 的 ceil
和使用下限
请注意,我只是将被除数 '$a' 作为 awk 行的第一个字段和除数 ' $b' 作为第二个。
This is a simple solution using Awk:
If you want the ceil of ($a/$b) use
and the floor use
Note that I just echo the dividend '$a' as the first field of the line to awk and the divisor '$b' as the second.
一些更简洁的 awk 逻辑
结果
Some more concise Awk logic
Result
如果除法返回非浮点数,则该函数不会加 1。
像这样使用它:
This function wont't add 1, if the division returns a non-floating number.
Use it like this:
一些更简洁的 awk 逻辑
结果
Some more concise Awk logic
Result
使用华丽的 'printf' 1 将四舍五入到下一个整数
ref: 如何从变量中删除小数?
Using the gorgeous 'printf' 1 will round up to the next integer
ref: how to remove decimal from a variable?
在不指定任何函数的情况下,我们可以使用以下 awk 脚本:
不确定这个脚本是否会出现任何逻辑错误。请纠正。
Without specifying any function, we can use the following awk script:
Not sure this one get any logical error or not. Please correct.
如果您已经熟悉 Python 库,那么您可能想要定义这个 bash 函数,而不是学习 bc :
那么:
但任何有效的 python 表达式 都可以工作:
If you are already familiar with the Python library, then rather than learn
bc
, you might want to define this bash function:Then:
but also any valid python expression works: