标签: arithmetic

为什么 $((40-35)) 变成了 5?

背后隐藏着什么奇怪的shell语法,它是$((40-35))如何计算值的?

例子:

$> echo $((40-35))
5
Run Code Online (Sandbox Code Playgroud)

shell bash arithmetic

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

shell 脚本中的单位乘数转换

我需要将人类可读的大小转换为字节。不幸的是,我无法访问 numfmt 函数。还有其他选择吗?我需要一个 shell/bash 函数来从 sh 脚本内部调用。

1K 应转换为 1000,1M 应转换为 1000 000 等。

shell bash arithmetic

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

将变量除以数字?

基本上我需要将厘米转换为英寸,我试图通过将厘米的面积乘以 2.54 来实现。

但我就是无法让它发挥作用。

echo "please enter width and then height"

read width
read height

area=$(($width * $height))
inchesarea=$((area / 2.54))

echo $area
echo $inchesarea
Run Code Online (Sandbox Code Playgroud)

我应该bc为此使用吗?

shell-script arithmetic floating-point

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

获取线对并相乘

我正在尝试使用 bash 为某些值解析 html 文件。所以我有一个大文本文件,里面有这样的数字

3
2
4
2
Run Code Online (Sandbox Code Playgroud)

我想要做的是得到两行,将两个数字相乘,然后将值存储在变量中并将其添加到总数中。在这种情况下,它将是3*2=64*2=8。因此,X=0, X=X+6, X=X+8然后X=14

bash text-processing arithmetic

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

算术替换中的命令替换是否会拆分单词?

我好像从本站的评论中记得算术展开的内容可能是分词的,但是又找不到评论了。

考虑以下代码:

printf '%d\n' "$(($(sed -n '/my regex/{=;q;}' myfile)-1))"
Run Code Online (Sandbox Code Playgroud)

如果sed命令输出一个多位数字并且$IFS包含数字,那么在算术发生之前,命令替换是否会进行单词拆分?

(我已经使用额外的双引号进行了测试:

printf '%d\n' "$(("$(sed -n '/my regex/{=;q;}' myfile)"-1))"
Run Code Online (Sandbox Code Playgroud)

这不起作用。)


顺便说一句,上面的示例代码是我刚刚在 Stack Overflow 上发布的这个函数的简化形式的更改。

bash arithmetic words

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

awk 或 sed 列内的算术运算

我有一个文件,其列包含我想合并到算术结果的简单算术方程。

输入样本(制表符分隔的列):

+104-1+12   6   +3
Run Code Online (Sandbox Code Playgroud)

我想计算每列中的算术和。如果一列不包含算术符号,我会将其视为+在该项目之前包含 a 。尽管+如果列以无符号开头,则通过 sed 添加符号会很容易(sed -E 's/(\t)([0-9]*)/\1\t+\2/g'假设行从不以数字开头,如示例中所示)

我期望的输出如下:

115 6   3
Run Code Online (Sandbox Code Playgroud)

我怎样才能在 unix 中实现这一点?awk/sed 解决方案是首选。

text-processing arithmetic

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

为什么 $((0.1)) 在 zsh 中扩展到 0.10000000000000001?

zsh

$ echo $((0.1))
0.10000000000000001
Run Code Online (Sandbox Code Playgroud)

而在其他带有浮点算术扩展的 shell 中:

$ ksh93 -c 'echo $((0.1))'
0.1
$ yash -c 'echo $((0.1))'
0.1
Run Code Online (Sandbox Code Playgroud)

或者awk

$ awk 'BEGIN{print 0.1 + 0}'
0.1
Run Code Online (Sandbox Code Playgroud)

为什么?


这是聊天讨论的后续

zsh arithmetic floating-point

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

如何在Bash中对文件中的变量求和

我需要逐行对文件中的数字求和。

文件:

1.0
0.46
0.67
Run Code Online (Sandbox Code Playgroud)

我想求和,然后除以 3。

我目前有:

while IFS= read -r var
do
   x=$(($var + $x)) | bc -l
done < "file.txt"
echo "$x / 3"
Run Code Online (Sandbox Code Playgroud)

我的错误:

-bash: 1.0 + 0: syntax error: invalid arithmetic operator (error token is ".0 + 0")
Run Code Online (Sandbox Code Playgroud)

bash arithmetic

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

为什么我们不能比较。(dot) 作为 if 语句圆括号内的字符串值?

问题

我必须将字符串“problem1.sh”与其自身进行比较。在我使用方括号进行比较的情况下solution1.sh (如下所示),它工作正常。但是,在我使用圆括号的情况下solution2.sh (如下所示),它不起作用。它显示了提到的错误(如下所示)

我尝试过什么?

我试图从这里这里了解在 bash 脚本中使用方括号和圆括号之间的区别。我知道它((expression))用于比较算术值,而不是用于字符串值。

那么,是什么造成了这个问题?

如果我从字符串“problem1.sh”中删除子字符串“.sh”并使用相同的语句进行比较if (("problem1" == "problem1")),它工作正常。但是,当我只是添加“。” 在字符串中,它会产生问题。即使我删除了除“.”之外的所有内容。从字符串并使用语句if (("." == ".")),它显示我错误。

然后,我的问题

如果该语句if (("problem1" == "problem1"))可以正常工作(可能对英文字母的每个字母都可以正常工作),为什么“。” 字符串会产生问题吗?我的意思是,为什么我们不能比较“。” if (("." == "."))当我们可以使用相同的表达式(例如if (("findError" == "findError")))比较字母时,在 bash 脚本的 if 语句(例如)中使用圆括号?

解决方案1.sh

if [ "problem1.sh" == "problem1.sh" ]
then
        printf "Okay"   
fi
Run Code Online (Sandbox Code Playgroud)

解决方案2.sh

if (( "problem1.sh" == "problem1.sh" ))
then
        printf "Okay"   
fi
Run Code Online (Sandbox Code Playgroud)

solution2.sh …

shell bash string shell-script arithmetic

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

将算术应用到管道命令中

到目前为止我有这个:

sudo find /path/to/dir -type f |
  xargs -d "\n" sudo stat -c "%Y %n" | 
    {arithmetic to check if %Y is between 1685518962 and 1685624474??} | 
      {show file path}
Run Code Online (Sandbox Code Playgroud)

需要注意的是,我知道find -newermt但更普遍地询问有关在命令行中执行算术的问题。

澄清一下,我希望能有一句台词。

TCSH 或 BASH 对我来说是可以接受的,但请不要犹豫,用另一种 shell 来启发我。

pipe find xargs stat arithmetic

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