计算时 bash 中的变量错误
variable error in bash when doing calculation
我将管道的输出分配给一个变量,但是当我尝试使用该变量进行数学计算时,它不允许我:
%%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"
您收到该错误是因为您将无效的算术表达式传递给 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 个小数点。
我将管道的输出分配给一个变量,但是当我尝试使用该变量进行数学计算时,它不允许我:
%%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"
您收到该错误是因为您将无效的算术表达式传递给 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 个小数点。