我怎样才能让我的脚本为自己确定最大的数字?
我查看了我的环境变量,我发现这两个看起来很有希望:
~# declare -p BASH_VERSINFO HOSTTYPE
declare -ar BASH_VERSINFO=([0]="5" [1]="0" [2]="11" [3]="1" [4]="release" [5]="x86_64-slackware-linux-gnu")
declare -- HOSTTYPE="x86_64"
Run Code Online (Sandbox Code Playgroud)
...但我真的可以相信解析这些,以便得出关于 Bash 算术中最大数字是多少的结论吗?必须有更好的方法,以编程方式。有什么建议?
我知道的唯一计算器是bc. 我想添加1到一个变量,并输出到另一个变量。
我nextnum从文件中的计数字符串中得到了变量:
nextnum=`grep -o stringtocount file.tpl.php | wc -w`
Run Code Online (Sandbox Code Playgroud)
让我们说nextnum价值是1。添加时1,它会变成2. 为了计算,我运行:
rownum=`$nextnum+1 | bc`
Run Code Online (Sandbox Code Playgroud)
但有错误:
1+1: command not found
Run Code Online (Sandbox Code Playgroud)
我只是在计算部分失败了。我试过改变反引号,但仍然无效。我不知道如何计算变量并将其输出到另一个变量。
如何在命令行上正确舍入 IEEE 754 浮点数?
我想指定输出数字的精度 - 小数位数。
例如,四舍五入6.66到精度1应该给出6.7。更多见下表:
Value Precision Rounded
6.66 0 7
6.66 1 6.7
6.66 2 6.66
6.66 3 6.660
6.666 3 6.666
6.6666 3 6.667
Run Code Online (Sandbox Code Playgroud)
它应该可以在交互式 shell 中使用,但理想情况下足够健壮,可以在生产 shell 脚本中使用它。
我想知道一系列进程在我的计算机中决定我是应该在那里运行还是在更强大的计算机中运行所需的总时间。所以,我正在预测每个命令的运行时间。输出看起来像:
process1 00:03:34
process2 00:00:35
process3 00:12:34
Run Code Online (Sandbox Code Playgroud)
如何对第二列求和以获得总运行时间?我可以试着把每一行都穿过
awk '{sum += $2 } END { print sum }
Run Code Online (Sandbox Code Playgroud)
但这没有意义,因为这些值不是自然数。
我有一个名为 Build.number 的文件,内容值为012,我需要将其增加 +1。所以,我试过这个
BN=$($cat Build.number)
BN=$(($BN+1))
echo $BN >Build.number
Run Code Online (Sandbox Code Playgroud)
但在这里,当我期待013时,我得到了值 11 。谁能帮我?
我遇到了一个奇怪的问题。为了演示,让我们取我机器上最大的无符号数(printf "%X \n" -1给我FFFFFFFFFFFFFFFF),并尝试移动一些位。?首先,向左移动:
printf "%X \n" $(( 0xFFFFFFFFFFFFFFFF<<4 ))
FFFFFFFFFFFFFFF0
printf "%X \n" $(( 0xFFFFFFFFFFFFFFFF<<8 ))
FFFFFFFFFFFFFF00
printf "%X \n" $(( 0xFFFFFFFFFFFFFFFF<<16 ))
FFFFFFFFFFFF0000
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好。正如预期的那样。现在让我们尝试右移:
printf "%X \n" $(( 0xFFFFFFFFFFFFFFFF>>4 ))
FFFFFFFFFFFFFFFF
printf "%X \n" $(( 0xFFFFFFFFFFFFFFFF>>8 ))
FFFFFFFFFFFFFFFF
printf "%X \n" $(( 0xFFFFFFFFFFFFFFFF>>16 ))
FFFFFFFFFFFFFFFF
Run Code Online (Sandbox Code Playgroud)
等等,什么??为什么这不起作用?这是一个错误吗?
编辑:
我害怕有人会建议与提出的符号位有某种联系。但我们不是在谈论算术,所以符号的概念在这里没有立足之地。其他工具如*和/用于算术。拥有一个可以操作位的工具的全部意义在于能够操作位——无论我以后如何选择显示这些位,有符号还是无符号。对?喜欢:
printf "%u \n" -1
18446744073709551615
Run Code Online (Sandbox Code Playgroud)
有人有什么想法吗?
编辑:
由于这里的答案直接涉及乘法或除法,让我尝试更清楚地解释我的担忧。乘法/除法和位移位是两种不同的东西,尽管我可以在长期程序员的脑海中看到它们之间的联系。做算术的时候,必须要有符号的概念;对于位移,你没有。Bash 为我们提供了两种截然不同的工具集来处理这两种不同的事情。当我想将一个数字乘以 2 时,我会使用该*工具。Bash 在底层可以使用位移进行算术这一事实超出了重点。
引用其中一个答案...
如果没有复制符号位,结果将变成无符号数。例如,将 8 位值
1111 0000向右移动一次将给出 …
如何在bash中计算很长的数字?
param=$(( 3247238523785623478565 + 53453453252345346534563412634 ))
echo $param
3420247196502465471
Run Code Online (Sandbox Code Playgroud)
正如我们在这里看到的,由于整数的限制,这不是正确的答案。
我读过bash可以在不使用外部命令的情况下进行整数运算,例如:
echo "$((3 * (2 + 1)))"
Run Code Online (Sandbox Code Playgroud)
能否bash也做浮点运算,而无需使用外部命令?
我正在根据数字计算长宽比高度x,在这个例子中我使用 4:3 的比例,宽度为 800,结果(高度)应该是 600,但 bash 返回 800,我不知道为什么。
我尝试过其他语言,大多数似乎也有问题,php 似乎是少数可以工作的语言之一。
PHP(返回 600)
php -r 'echo 800/(4/3);'
Run Code Online (Sandbox Code Playgroud)
Python(返回 800)
python -c "print(800/(4/3))"
Run Code Online (Sandbox Code Playgroud)
bc -l有点有效(返回 600.00000000000000000150)
-l是“定义标准数学库”,不确定这意味着什么,但它似乎让我更接近我的目标,但是额外的 0 和 150 来自哪里?
echo '800 / (4 / 3)' | bc -l
Run Code Online (Sandbox Code Playgroud)
我猜这与浮点处理或截断3/4.
现在我可以使用php, 就到此为止了,但对于相对简单的计算来说似乎有点矫枉过正。知道这里发生了什么吗?
假设我有一堆表示内存量的数字,例如以“86k或”320m或“或”的形式书写1.7g。如何在命令行中计算它们的总和,并获得人类可读的结果?
能够计算减法也很好。完美的工具将处理多组符号(例如1g/ 1G/ 1GB/ 1Go/ 1GiB/ 1.7Gio)及其含义(二进制或十进制乘数)。
我正在寻找一个纯粹的计算器。这些数字不一定是我磁盘上某些文件的大小,因此诸如find、stat或 之du类的工具不是一种选择。
这显然很容易实现(在精度方面有一些障碍),但如果这还不存在,我会被诅咒!
arithmetic ×10
bash ×8
shell ×3
shell-script ×2
bc ×1
calculator ×1
command-line ×1
numeric-data ×1
time ×1