计算时bash中的变量错误

问题描述

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

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,z=u*100"

我收到此错误

CREATE TABLE [dbo].[usersettings](
    [user_id] [UNIQUEIDENTIFIER] NOT NULL,[setting_id] [UNIQUEIDENTIFIER] NOT NULL,[value] [varchar](50) NOT NULL,CONSTRAINT [PK_usersettings] PRIMARY KEY CLUSTERED ([user_id] ASC,[setting_id] ASC) );

解决方法

收到此错误是因为您将无效的算术表达式传递到了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

注意:

  • 执行cd之前不需要grep,它接受​​带有目标文件名的完整路径作为参数。因此,无需更改目录,您可以grep的各个位置。

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

  • 请记住,/除法38986/41858的结果为0,因为它是整数除法。如果要使用小数进行数学计算,则可以使用此post来了解如何使用bc

  • 要打印任何内容,请使用内置的printf外壳程序。在这里,最后两个数字的格式为2个小数点。