数字与 shell 脚本的乘积
Product of a digit with a shell script
如何得到 bash 中 1 的乘积? (12345 > 1x2x3x4x5)
我正在尝试获取一个脚本来进行乘法运算,我尝试过转义 * 字符但没有成功,我也尝试过摆弄 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"
gawk(GNU awk)解决方案:
echo 12345 | awk -v FPAT="[0-9]" '{ r=; for(i=2;i<=NF;i++) r=r*$i }END{ print r }'
输出:
120
FPAT="[0-9]"
- 表示字段值,以便每个字段包含一个数字
通过参数展开即可获取字符串长度,无需调用外部工具
#!/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"
据我了解,您想获得数字乘法的值
假设你有号码:
number=12345
您必须在数字之间插入 *:
echo $number | sed 's/\([0-9]\)/*/g'
我们将得到字符串:
1*2*3*4*5*
我们不需要最后的星号 - 让我们删除它:
echo $number | sed 's/\([0-9]\)/*/g' | sed 's/.$//g'
我们会得到这个:
1*2*3*4*5
我们现在可以将它重定向到 calc:
echo $number | sed 's/\([0-9]\)/*/g' | sed 's/.$//g' | calc -p
它的标准输出是:
120
\*
在算术表达式中是错误的,应该是单独的*
。但即便如此 运行 你的代码给出:
$ 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"
您的代码还有一些问题:
- 始终在顶部放置一个 shebang line
- 总是double quote变量
- 在
Bash
的算术表达式中不需要对变量使用 $
如何得到 bash 中 1 的乘积? (12345 > 1x2x3x4x5)
我正在尝试获取一个脚本来进行乘法运算,我尝试过转义 * 字符但没有成功,我也尝试过摆弄 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"
gawk(GNU awk)解决方案:
echo 12345 | awk -v FPAT="[0-9]" '{ r=; for(i=2;i<=NF;i++) r=r*$i }END{ print r }'
输出:
120
FPAT="[0-9]"
- 表示字段值,以便每个字段包含一个数字
通过参数展开即可获取字符串长度,无需调用外部工具
#!/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"
据我了解,您想获得数字乘法的值
假设你有号码:
number=12345
您必须在数字之间插入 *:
echo $number | sed 's/\([0-9]\)/*/g'
我们将得到字符串:
1*2*3*4*5*
我们不需要最后的星号 - 让我们删除它:
echo $number | sed 's/\([0-9]\)/*/g' | sed 's/.$//g'
我们会得到这个:
1*2*3*4*5
我们现在可以将它重定向到 calc:
echo $number | sed 's/\([0-9]\)/*/g' | sed 's/.$//g' | calc -p
它的标准输出是:
120
\*
在算术表达式中是错误的,应该是单独的*
。但即便如此 运行 你的代码给出:
$ 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"
您的代码还有一些问题:
- 始终在顶部放置一个 shebang line
- 总是double quote变量
- 在
Bash
的算术表达式中不需要对变量使用
$