我试图在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[@]}"