标签: arithmetic

Bash:预期的整数表达式,使用读取/测试

我正在学习 shell 编程的基础知识,所以我写了一些简单的东西,比如

#!/bin/bash
read var1
read var2
if [ var1 -lt var2 ]; then
    echo "var1 is lt var2"
else
    echo "var2 is lt var1"
fi
Run Code Online (Sandbox Code Playgroud)

我的理解是变量在 Bash 中是无类型的,并且任何变量如果只包含数字就可以用作整数。但是当我运行它时,我收到错误“预期的整数表达式”......为什么?

bash arithmetic

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

Bash 的条件运算符和赋值

我们可以在冒号后使用 bash 的条件运算符和赋值运算符吗?

Bash 参考手册解释了算术运算符如下。

  • 条件运算符 expr ? expr : expr
  • 任务 = *= /= %= += -= <<= >>= &= ^= |=

首先,这段代码似乎运行良好:

a=1; ((a? b=1 : 2 )) #seems to work
Run Code Online (Sandbox Code Playgroud)

但是当我在 之后使用赋值运算符时:,我得到了“尝试赋值给非变量”错误:

a=1; ((a? b=1 : c=1)) #attempted assignment to non-variable error
Run Code Online (Sandbox Code Playgroud)

为什么我们只能在冒号前使用赋值运算符?

shell bash shell-script arithmetic

7
推荐指数
1
解决办法
3万
查看次数

用AWK计算并除以总数

鉴于以下data文件...

foo     10
bar     20
oof     50
rab     20
Run Code Online (Sandbox Code Playgroud)

...我如何将第二列打印为第二列总数的百分比?换句话说,我想要...

foo     10    10%
bar     20    20%
oof     50    50%
rab     20    20%
Run Code Online (Sandbox Code Playgroud)

...当然,数字不太明显。我可以很容易地创建一个运行总数,但我不确定如何在打印行之前计算总数。我在 awk 文件中执行此操作totals.awk...

#!/usr/bin/awk -f
BEGIN{
        runningtotal=0
}
{
        runningtotal=runningtotal+$2
        print $1 "\t" $2 "\t" runningtotal "\t" $2/runningtotal
}
Run Code Online (Sandbox Code Playgroud)

所以,运行./totals.awk data收益...

foo     10      10      1
bar     20      30      0.666667
oof     50      80      0.625
rab     20      100     0.2
Run Code Online (Sandbox Code Playgroud)

有没有办法循环两次,一次计算总数,一次打印行?这在 AWK 中是可能的,还是我必须使用其他实用程序?

awk arithmetic

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

在 shell 脚本中处理 64 位整数

我正在尝试计算以太网接口上使用的带宽(1000 Mbit/s)。为了测试我的脚本,我使用iperf工具来生成巨大的带宽。

我现在面临的问题是,当eth0_rx1eth0_rx2变得其比最大32位的值大的值。我得到的差异为 0。

不知何故

printf 'eth0 Download rate: %s B/s\n' "$((eth0_rx2-eth0_rx1))"
Run Code Online (Sandbox Code Playgroud)

给出了正确的值,但是当尝试使用

eth0_diff=expr $eth0_rx2 - $eth0_rx1
Run Code Online (Sandbox Code Playgroud)

我得到的值为 0。

有没有办法处理超过 32 位rx_bytestx_bytes超过 32 位的情况?

我不确定这是计算已用带宽的优雅方法。如果没有,请建议其他替代方法。

示例输出:

eth0_rx1 = 2134947002 \
eth0_rx2= 2159752166 \
eth0 Download rate: 24805164 B/s \
eth0_diff = 12536645 \
eth0_rx_kB = 12242 \
eth0_rx_kB_100 = 1224200 \
eth0_rx_kB_BW = 9

eth0_rx1 = 2159752166 \
eth0_rx2= 2184557522 \
eth0 Download rate: 24805356 B/s \
eth0_diff = 0 …
Run Code Online (Sandbox Code Playgroud)

shell-script arithmetic

7
推荐指数
2
解决办法
994
查看次数

使用bash“双括号”算术扩展,数学失败,前导零

我有一个处理小时和分钟的简单脚本。

如果我想计算自午夜以来有一个字符串的分钟数,hh:mm我尝试拆分字符串然后做hh * 60 + mm

我的问题是,虽然

$ (( tot = 12 * 60 + 30 ))
$ echo $tot
750
Run Code Online (Sandbox Code Playgroud)

反而

$ (( tot = 09 * 60 + 30 ))
bash: ((: tot = 09: value too great for base (error token is "09")
Run Code Online (Sandbox Code Playgroud)

据我了解,字符串09不应作为基数为 10 的数字。

有没有比简单地删除字符串中的前导零更好的方法?

shell bash arithmetic

6
推荐指数
2
解决办法
1468
查看次数

是否可以在 Bash 的计数括号中使用变量?

我正在寻找我遇到的 Bash 4 问题的解决方案。

Bash 4 能够使用前导零进行迭代。

对于线路:

for i in {001..005}; do echo -n $i" ";done;echo
Run Code Online (Sandbox Code Playgroud)

输出是

001 002 003 004 005
Run Code Online (Sandbox Code Playgroud)

但是当我尝试这个时:

a="005"; for i in {001..${a}}; do echo $i;done
Run Code Online (Sandbox Code Playgroud)

或类似的东西,结果是:

{001..005}
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

bash arithmetic

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

") 语法错误 无效的算术运算符(错误标记是“

我在bash脚本中有命令从源文本文件中获取数据,然后将变量的值添加到它并在 if/else 条件下使用它。

源数据文件 ( db_count.ini) (注意:双引号内包含空格):

db_ctdy_sr=" 7"
Run Code Online (Sandbox Code Playgroud)

脚本:

source db_count.ini

# Removing the whitespace on the stored data
n_db_sr=${db_ctdy_sr// /}

# Sum
c=0
b=7

echo "Value of db:"$n_db_sr

sm=$((n_db_sr + c))

echo "The value of db:"
echo "$sm" 
echo $sm 

if [ "$sm" = "$b" ]
then
   echo "Success."
else
   echo "Not."
fi

echo "Bye!"
Run Code Online (Sandbox Code Playgroud)

但是当我运行脚本时,它总是我这个

The value of db:7
") Syntax error Invalid arithmetic operator (error token is "
The value of:


Not.
Bye! …
Run Code Online (Sandbox Code Playgroud)

shell-script arithmetic

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

对输入到命令行中的数字进行数学运算,无需调用 bc

有时我需要运行一些数学运算。我知道我可以使用bcecho $(( 6/2 ))。我创建了自己的函数bc来读取输入。但有时需要很长时间才能输入:_bc "6/2"。所以我有这个问题:

有没有办法教 zsh/bash 如何在命令行中对数字运行数学运算?一个例子超过数千个单词。

$ 6/2
$ 3.0
Run Code Online (Sandbox Code Playgroud)

这意味着 zsh/bash 必须识别数字并调用 ie bc

command-line bash zsh arithmetic

6
推荐指数
5
解决办法
2480
查看次数

为什么命令 a-=2 失败?

执行命令后declare -i a=5,命令a+=2成功,但命令a-=2失败。有人可以解释 bash 的这种奇怪行为吗?

bash arithmetic

6
推荐指数
3
解决办法
1897
查看次数

如何将以零开头的数字视为十进制整数

输入将是如下文件名:

A-B-000001-C
A-B-000002-C
.....
.....
A-B-999999-C
Run Code Online (Sandbox Code Playgroud)

所有文件应该是连续的。我想找到丢失的连续文件名。为此,我使用awk分隔 6 位序列号 ,并使用grep和正则表达式来检查文件是否存在于目录中。

`ls|grep "A-B-${sequencenumber}-.*"|wc -l`
Run Code Online (Sandbox Code Playgroud)

但 shell 脚本不会将数字视为十进制,如果我使用10#$sequencenumber强制将数字视为十进制,那么它会删除搜索文件所需的前面的零。

有没有办法解决?

shell shell-script arithmetic

5
推荐指数
1
解决办法
1856
查看次数

标签 统计

arithmetic ×10

bash ×6

shell-script ×4

shell ×3

awk ×1

command-line ×1

zsh ×1