如何在bash中使用expr来相乘一系列的数字



我试图在bash中获得一个数字的阶乘,这显然是一个简单的程序,使用循环我可以做到这一点,例如

#!/usr/bin/bash
echo "Enter number"
read number
#echo  `seq -s "*" 1 $number | bc`
result=1
for((i=1;i<=number;i++))
do
result=$(($result*i))
done
echo "The factorial of $number is $result"

然后我试着找到一些一行字,我的意思是bash以一行字而闻名,使用seq和bc效果很好。

sourav@LAPTOP-HDM6QEG8:~$ num=5
sourav@LAPTOP-HDM6QEG8:~$ seq -s "*" 1 $num | bc
120

使用$(它也像一样工作

sourav@LAPTOP-HDM6QEG8:~$ echo $((`seq -s "*" 1 $num`))
120

然而,当我试图使用expr时,我无法做到。

sourav@LAPTOP-HDM6QEG8:~$ expr `seq -s " * " 10`
expr: syntax error: unexpected argument ‘0’

我想既然*是一个通用符号,我应该逃离它,但它仍然不起作用

sourav@LAPTOP-HDM6QEG8:~$ expr `seq -s " * " 10`
expr: syntax error: unexpected argument ‘\*’

然而,我可以像这个一样执行求和

sourav@LAPTOP-HDM6QEG8:~$ expr `seq -s " + " 10`
55

那么,为什么我在试图用expr求级数的乘积时会出错,有人能解释一下吗??

来自bash手册:

展开的顺序是:大括号展开;波浪号展开、参数和变量展开、算术展开以及命令替换(以从左到右的方式完成);分词;和文件名扩展

命令替换用其输出替换`command`的结果,然后文件名扩展用与glob匹配的文件名列表替换该输出中的任何globbing字符。您无法通过在数据中嵌入之类的转义符来解决这一问题,因为语法解析发生在任何扩展之前,因此这些字符将被视为文字字符,而不是转义符。

这个问题的解决方案通常是使用数组,因为数组可以安全地保存数据:

#!/bin/bash
read -ra sequence <<< "$( seq -s " * " 10 )"
expr "${sequence[@]}"

相关内容

  • 没有找到相关文章