【问题标题】:variable error in bash when doing calculation计算时bash中的变量错误
【发布时间】:2020-10-20 04:28:31
【问题描述】:

我将管道的输出分配给一个变量,但是当我尝试使用该变量进行数学运算时,它不允许我:

%%bash
cd /data/ref/
grep -v ">" EN | wc -c > ref
cat ref
cd /example/
grep -v ">" SR | wc -l > sample
cat sample

echo $((x= cat sample, y= cat ref, u=x/y, z=u*100))

我收到此错误:

41858
38986
bash: line 7: x= cat sample, y= cat ref, u=x/y, z=u*100: syntax error in expression (error token is "sample, y= cat ref, u=x/y, z=u*100"

【问题讨论】:

  • @user432797 : cat 这个词既不是数字,也不是变量。即使是一个变量,后面的词 sample 也没有意义。

标签: bash pipe syntax-error variable-assignment command-substitution


【解决方案1】:

您收到该错误是因为您将无效的算术表达式传递到 bash arithetic expansion。这个地方只允许使用算术表达式。你尝试做的看起来像这样:

ref="$(grep -v ">" /data/ref/EN | wc -c)"
sample="$(grep -v ">" /example/SR | wc -l)"

# this is only integer division
#u=$(( sample / ref ))
#z=$(( 100 * u ))

# to do math calculations, you can use bc
u=$(bc <<< "scale=2; $sample/$ref")
z=$(bc <<< "scale=2; 100*$u")

printf "%d, %d, %.2f, %.2f\n" "$ref" "$sample" "$u" "$z"

所以希望你得到这样的输出:

41858, 38986, 0.93, 93.00

注意事项:

  • 在执行grep 之前不需要cd,它接受带有目标文件名的完整路径作为参数。所以不用换目录,就可以grep各个位置。

  • 为了保存您的命令的输出(这只是一个数字),您不需要将其保存在文件和cat 文件中。只需使用语法var=$( )var 将被分配此command substitution 的输出。

  • 请记住,/ 将导致除法 38986/41858 为 0,因为它是整数除法。如果您想使用小数进行数学计算,您可以查看此post,了解如何使用bc 进行计算。

  • 要打印任何内容,请使用内置的 shell printf。这里最后两个数字用 2 个小数点格式化。

【讨论】:

  • 这很有帮助@thanasisp,我正在阅读这篇文章,但我不知道如何将其应用于我的问题shell-tips.com/bash/math-arithmetic-calculation,但您的回答涵盖了很多内容。现在要学printf了,有没有比printf更容易直接打印输出的呢?
  • 是的,使用echo "$ref" "$sample" "$u" "$z" 请记住,它会打印 2 个小数点,因为我们将 scale=2 传递给 bc,所以我们得到了这个结果。使用printf,您可以插入文本,做很多事情,只打印一个变量 echo 就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-19
  • 2023-03-07
  • 1970-01-01
  • 2011-09-12
  • 1970-01-01
  • 1970-01-01
  • 2013-03-13
相关资源
最近更新 更多