标签: arithmetic

使用 bash 函数在命令行上做简单的数学运算:$1 除以 $2(可能使用 bc)

有时我需要将一个数除以另一个数。如果我可以为此定义一个 bash 函数,那就太好了。到目前为止,我被迫使用诸如

echo 'scale=25;65320/670' | bc
Run Code Online (Sandbox Code Playgroud)

但如果我能定义一个看起来像的 .bashrc 函数就太好了

divide () {
  bc -d $1 / $2
}
Run Code Online (Sandbox Code Playgroud)

command-line function arithmetic bc bashrc

33
推荐指数
4
解决办法
7万
查看次数

检查 $REPLY 是否在一个数字范围内

我正在为 Linux 编写一个 shell 脚本,使用 Bash,将任何视频文件转换为 MP4。为此,我将avconvwithlibvorbis用于音频。

在我的脚本中,我有一个问题要问用户:

read -p "- Audio Quality [scale from -2 to 10] ? "
    if [ -n "$REPLY" ] ; then
    ABITRATE="-aq $REPLY"
    fi
Run Code Online (Sandbox Code Playgroud)

我的“ABITRATE”字符串进入最终的avconv命令行。

但我想让用户有机会用 Kb(千位)值来回答这个问题,并将其转换为libvorbis使用的比例。“从 -2 到 10 的比例”是这样的:

Quality Kbit/s  Normalization
-----------------------------
 -2      ~32        y
 -1      ~48        y
  0      ~64        y
  1      ~80        y
  2      ~96        y
  3     ~112        y
  4     ~128        n
  5     ~160        n
  6     ~192        n
  7     ~224        n
  8 …
Run Code Online (Sandbox Code Playgroud)

bash shell-script arithmetic

32
推荐指数
3
解决办法
8万
查看次数

在 Shell 算术评估中使用未经处理的数据的安全影响

在对最近问题评论中,Stéphane Chazelas 提到双括号算术存在安全隐患,例如:

x=$((1-$x))
Run Code Online (Sandbox Code Playgroud)

在大多数贝壳上。

我的谷歌技能似乎生疏了,我找不到任何东西。双括号算术的安全含义是什么?

shell security arithmetic

29
推荐指数
1
解决办法
1188
查看次数

shell 脚本中的二进制到十六进制和十进制

我有一个上下文,我需要在 shell 脚本中将二进制转换为十六进制和十进制,反之亦然。有人可以建议我一个工具吗?

shell-script binary arithmetic

27
推荐指数
4
解决办法
8万
查看次数

bash -e 在 let 或 expr 计算为 0 时退出

我有一个设置 -e 的 bash 脚本,因此脚本将在任何退出状态下退出!= 0。

我正在尝试执行一些分配给变量的基本 shell 算术,有时表达式等于 0,这会导致 let 或 expr 命令的退出状态为“1”。

下面是一个例子:

#!/bin/bash -ex
echo "Test 1"
Z=`expr 1 - 1` || true
echo "Z will print"
let "A=4 - 4"
echo "A WILL NEVER PRINT $A"
Y=`expr 1 - 1`
echo "Y WILL NEVER PRINT $Y"
X=$(expr 2 - 2)
echo "X WILL NEVER PRINT $X"
Run Code Online (Sandbox Code Playgroud)

输出是:

$ ./test_error.sh 
+ echo 'Test 1'
Test 1
++ expr 1 - 1
+ Z=0
+ true
+ echo …
Run Code Online (Sandbox Code Playgroud)

scripting bash exit arithmetic

24
推荐指数
1
解决办法
8027
查看次数

Bash 中的按位移位和最大整数

这是一个探索性问题,这意味着我不完全确定这个问题是关于什么的,但我认为它是关于 Bash 中最大的整数。无论如何,我会明示地定义它。

$ echo $((1<<8))
256
Run Code Online (Sandbox Code Playgroud)

我通过移动一点来产生一个整数。我能走多远?

$ echo $((1<<80000))
1
Run Code Online (Sandbox Code Playgroud)

显然没有那么远。(1 是出乎意料的,我会回到它。)但是,

$ echo $((1<<1022))
4611686018427387904
Run Code Online (Sandbox Code Playgroud)

仍然是积极的。然而,不是这个:

$ echo $((1<<1023))
-9223372036854775808
Run Code Online (Sandbox Code Playgroud)

再往前走一步,

$ echo $((1<<1024))
1
Run Code Online (Sandbox Code Playgroud)

为什么是 1?为什么会出现以下情况?

$ echo $((1<<1025))
2
$ echo $((1<<1026))
4
Run Code Online (Sandbox Code Playgroud)

有人想分析这个系列吗?

更新

我的机器:

$ uname -a
Linux tomas-Latitude-E4200 4.4.0-47-generic #68-Ubuntu SMP Wed Oct 26 19:39:52 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

bash arithmetic

22
推荐指数
2
解决办法
2万
查看次数

awk 高精度算术

我正在寻找一种方法来告诉 awk 在替换操作中进行高精度算术。这涉及从文件中读取一个字段,并用该值的 1% 增量替换它。但是,我在那里失去了精度。这是问题的简化再现:

 $ echo 0.4970436865354813 | awk '{gsub($1, $1*1.1)}; {print}'
   0.546748
Run Code Online (Sandbox Code Playgroud)

在这里,我有一个 16 位的小数精度,但 awk 只给出了 6 位。使用 printf,我得到了相同的结果:

$ echo 0.4970436865354813 | awk '{gsub($1, $1*1.1)}; {printf("%.16G\n", $1)}'
0.546748
Run Code Online (Sandbox Code Playgroud)

关于如何获得所需精度的任何建议?

awk arithmetic floating-point

19
推荐指数
2
解决办法
2万
查看次数

为什么 a=0; 让a++返回退出代码1?

尝试一下:

$ a=0
$ let a++
$ echo $?
1 # Did the world just go mad?
$ echo $a
1 # Yes, it did.
$ let a++
$ echo $?
0 # We have normality.
$ echo $a
2
Run Code Online (Sandbox Code Playgroud)

对比一下:

$ b=0
$ let b+=1
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

这(来自Sirex):

$ c=0
$ let ++c
$ echo $?
0
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

$ bash --version
GNU bash, version 4.1.5(1)-release (x86_64-pc-linux-gnu)
Run Code Online (Sandbox Code Playgroud)

bash ksh arithmetic

17
推荐指数
1
解决办法
3386
查看次数

为什么“$(( ~33 ))”产生-34?

$ echo $(( 255 ))
255
$ echo $(( 33 ))
33
$ echo $(( ~33 ))
-34
$ echo $(( ~255 ))
-256
$ 
Run Code Online (Sandbox Code Playgroud)

我的内核是:

$ uname -a
Linux HOSTNAME 3.2.0-40-generic-pae #64-Ubuntu SMP Mon Mar 25 21:44:41 UTC 2013 i686 i686 i386 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

问题: ~用于否定 AFAIK 数字。但是为什么~33产生-34,为什么~255产生-256

shell bash arithmetic

15
推荐指数
2
解决办法
4939
查看次数

如何在 Bash 中增加局部变量?

数据

1
\begin{document}
3
Run Code Online (Sandbox Code Playgroud)

代码

#!/bin/bash

function getStart {
        local START="$(awk '/begin\{document\}/{ print NR; exit }' data.tex)"
        echo $START
}

START2=$(getStart)
echo $START2
Run Code Online (Sandbox Code Playgroud)

返回2但我想要3. 我在这个关于如何在 bash 脚本中添加数字的答案中最终更改失败:

START2=$((getStart+1))
Run Code Online (Sandbox Code Playgroud)

如何在 Bash 脚本中增加局部变量?

bash function arithmetic variable

15
推荐指数
1
解决办法
6万
查看次数