2017-05-31 70 views
3

如何在Bash中获得1数字的产品? (12345> 1x2x3x4x5)带外壳脚本的数字产品

我想获得一个脚本来做乘法,我试过逃避* char但没有运气,我也试过摆弄expr。

echo -n "Enter number " 
read n 

len=$(echo $n | wc -c) 

len=$(($len - 1)) 

for ((i=1; i <= $len; i++)) 
do 
    prod=$(($prod \* $(echo $n | cut -c $i))) 
done 
echo "Product of $n is $prod" 
+1

解析规则在'$((...))'内部改变;您不需要转义'*',因为不执行路径名扩展。 – chepner

+0

谢谢你们!我也设法通过简化for循环来解决这个问题,并设置一个值为prod。 –

回答

2

您可以从参数扩展中获取字符串的长度,无需调用外部工具。

#!/bin/bash 
read -p 'Enter number: ' n 

product=1 
for ((i=0; i < ${#n}; ++i)) ; do 
    d=${n:i:1} 
    ((product *= d)) 
done 
printf '%d\n' $product 

而且,为了好玩,使用Perl:

perl -MList::Util=product -le 'print product(split //, shift)' -- "$n" 
1

GAWK(GNU AWK)溶液:

echo 12345 | awk -v FPAT="[0-9]" '{ r=$1; for(i=2;i<=NF;i++) r=r*$i }END{ print r }' 

输出:

120 

  • FPAT="[0-9]" - 表示字段值以便每个字段包含一个数字
+0

我的错误。谢谢你的确认。 –

1

我了解你想在数

位数乘法的价值假设你有号:

number=12345 

你必须在数字之间插入*:

echo $number | sed 's/\([0-9]\)/\1*/g' 

我们将得到的字符串:

1*2*3*4*5* 

我们并不需要最后asteriks - 让我们将其删除:

echo $number | sed 's/\([0-9]\)/\1*/g' | sed 's/.$//g' 

我们会得到这样的:

1*2*3*4*5 

我们可以现在重定向到calc:

echo $number | sed 's/\([0-9]\)/\1*/g' | sed 's/.$//g' | calc -p 

它的stdout是:

120 
1

\*是错误的算术表达式,它应该是*独自一人。但即使如此,运行代码给出:

$ bash product.sh 
Enter number 12 
product.sh: line 10: * 1 : syntax error: operand expected (error token is "* 1 ") 
Product of 12 is 

的原因错误是$prod变量没有被设置为 初始值,所以它的扩展为空值之前,例如 尝试在你的终端:

$ echo $prod 

$ 

在你的脚本,你应该使用 它首次之前设置prod为初始值。它应该是:

echo -n "Enter number " 
read n 

len=$(echo $n | wc -c) 

len=$(($len - 1)) 

prod=1 

for ((i=1; i <= $len; i++)) 
do 
    prod=$(($prod * $(echo $n | cut -c $i))) 
done 
echo "Product of $n is $prod" 

有一些更多的问题与您的代码: