背后隐藏着什么奇怪的shell语法,它是$((40-35))如何计算值的?
例子:
$> echo $((40-35))
5
Run Code Online (Sandbox Code Playgroud) 我需要将人类可读的大小转换为字节。不幸的是,我无法访问 numfmt 函数。还有其他选择吗?我需要一个 shell/bash 函数来从 sh 脚本内部调用。
1K 应转换为 1000,1M 应转换为 1000 000 等。
基本上我需要将厘米转换为英寸,我试图通过将厘米的面积乘以 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为此使用吗?
我正在尝试使用 bash 为某些值解析 html 文件。所以我有一个大文本文件,里面有这样的数字
3
2
4
2
Run Code Online (Sandbox Code Playgroud)
我想要做的是得到两行,将两个数字相乘,然后将值存储在变量中并将其添加到总数中。在这种情况下,它将是3*2=6和4*2=8。因此,X=0, X=X+6, X=X+8然后X=14。
我好像从本站的评论中记得算术展开的内容可能是分词的,但是又找不到评论了。
考虑以下代码:
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 上发布的这个函数的简化形式的更改。
我有一个文件,其列包含我想合并到算术结果的简单算术方程。
输入样本(制表符分隔的列):
+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 解决方案是首选。
在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)
为什么?
这是聊天讨论的后续
我需要逐行对文件中的数字求和。
文件:
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) 问题
我必须将字符串“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 …
到目前为止我有这个:
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 来启发我。