如果与Shell脚本的总和和乘积匹配,则打印数字
我的脚本有语法错误,我确定我有逻辑集,但脚本的格式似乎有问题 预期的工作流是 如果n=((总和)+(乘积)),则打印n,并重复n+。 否则n++重复如果与Shell脚本的总和和乘积匹配,则打印数字,shell,if-statement,while-loop,sum,product,Shell,If Statement,While Loop,Sum,Product,我的脚本有语法错误,我确定我有逻辑集,但脚本的格式似乎有问题 预期的工作流是 如果n=((总和)+(乘积)),则打印n,并重复n+。 否则n++重复 #!/bin/bash function sum() { local n=$1 local res=0 while [ $n -gt 0 ] do local sdigit=$(( $n % 10 )) local n=$(( $n / 10 )) local
#!/bin/bash
function sum() {
local n=$1
local res=0
while [ $n -gt 0 ]
do
local sdigit=$(( $n % 10 ))
local n=$(( $n / 10 ))
local res=$(( $res + $sdigit ))
done
echo $res
}
function prod() {
len=$(echo $1 | wc -c)
len=$(( $len - 1 ))
res=1
for (( i=1; i <= $len; i++ ))
do
res=$(($res * $(echo $1 | cut -c $i) ))
done
echo $res
}
#####################################################
n=0
my_prod=$(prod $n)
my_sum=$(sum $n)
while [ $n -le 10 ];
do
if (( n == $((my_prod + my_sum)) ))
then
echo "$n"
n++
break
else
n++
fi
done
#/bin/bash
函数和(){
本地n=1美元
本地res=0
而[$n-gt 0]
做
本地数字=$($n%10))
本地n=$($n/10))
本地资源=$($res+$sdigit))
完成
回声$res
}
函数prod(){
len=$(echo$1 | wc-c)
len=$($len-1))
res=1
for((i=1;i((表达式))
将执行算术运算,但不会返回任何内容,因此这是无效的:
# INVALID SYNTAX
if [ $n = (($my_prod + $my_sum)) ]
另外,=
将比较字符串,因此01=1
返回false。首选=
或-eq
。总之,这就是您想要的:
if [ $n -eq $(($my_prod + $my_sum)) ]
(我没有检查其他线路,但shellcheck是你的朋友。)
编辑:借用评论,这也很好:
if (( n == $((my_prod + my_sum)) ))
((表达式))
将执行算术运算,但不会返回任何内容,因此这是无效的:
# INVALID SYNTAX
if [ $n = (($my_prod + $my_sum)) ]
另外,=
将比较字符串,因此01=1
返回false。首选=
或-eq
。总之,这就是您想要的:
if [ $n -eq $(($my_prod + $my_sum)) ]
(我没有检查其他线路,但shellcheck是你的朋友。)
编辑:借用评论,这也很好:
if (( n == $((my_prod + my_sum)) ))
继续我的评论,在运行shell检查并没有错误之后,您仍然必须修复n++
,这本身就是一个错误。要增加n
,请使用((n++)
)
您也没有在while
循环的每次迭代中更新my_prod
和my_sum
。您对n=$((my_prod+my_sum))
的比较是可疑的。我怀疑您在if((my_prod==my_sum))之后
。这将允许您比较say22
的乘积和数字之和是否相等(例如2+2=2*2
)。更正这些将允许您的代码进行我认为您需要的比较,例如
n=0
while [ $n -le 30 ];
do
my_prod=$(prod $n)
my_sum=$(sum $n)
printf "n(%2d) - prod: %3d, sum: %3d" "$n" "$my_prod" "$my_sum"
if ((my_prod == my_sum))
then
# echo "$n -> product ($my_prod) == sum ($my_sum)"
printf " -> (%3d == %3d)" "$my_prod" "$my_sum"
fi
printf "\n"
((n++))
done
您可以清理prod
和sum
如下所示。注意为了避免调用循环中的实用程序(例如cut
等),这将产生单独的子进程,您可以简单地使用mod,除以10
逻辑来分解prod()中的数字
和sum()
,例如
sum() {
local len=${#1}
local res=0
local n=$1
local res=0
while [ $n -gt 0 ]
do
local sdigit=$(( n % 10 ))
local n=$(( n / 10 ))
local res=$(( res + sdigit ))
done
echo $res
}
prod() {
local len=${#1}
local res=1
local n=$1
while [ $n -gt 0 ]
do
local sdigit=$(( n % 10 ))
local n=$(( n / 10 ))
local res=$(( res * sdigit ))
done
echo $res
}
注意:如果使用支持字符串索引的类似shell的bash,则可以进一步将prod()
和sum()
缩减为:
sum() {
[ -z "$1" ] && {
echo 0
return 1
}
echo $(($1 + $1))
}
prod() {
[ -z "$1" ] && {
echo 0
return 1
}
echo $(($1 * $1))
}
将这些部分放在一起,您可以执行以下类似操作:
#!/bin/bash
sum() {
local len=${#1}
local res=0
local n=$1
local res=0
while [ $n -gt 0 ]
do
local sdigit=$(( n % 10 ))
local n=$(( n / 10 ))
local res=$(( res + sdigit ))
done
echo $res
}
prod() {
local len=${#1}
local res=1
local n=$1
while [ $n -gt 0 ]
do
local sdigit=$(( n % 10 ))
local n=$(( n / 10 ))
local res=$(( res * sdigit ))
done
echo $res
}
n=0
while [ $n -le 30 ];
do
my_prod=$(prod $n)
my_sum=$(sum $n)
printf "n(%2d) - prod: %3d, sum: %3d" "$n" "$my_prod" "$my_sum"
if ((my_prod == my_sum))
then
printf " -> (%3d == %3d)" "$my_prod" "$my_sum"
fi
printf "\n"
((n++))
done
示例使用/输出
在0-30
之间查找这些乘积和分解数之和,您会发现:
$ bash prodsum.sh
n( 0) - prod: 0, sum: 0 -> ( 0 == 0)
n( 1) - prod: 1, sum: 1 -> ( 1 == 1)
n( 2) - prod: 2, sum: 2 -> ( 2 == 2)
n( 3) - prod: 3, sum: 3 -> ( 3 == 3)
n( 4) - prod: 4, sum: 4 -> ( 4 == 4)
n( 5) - prod: 5, sum: 5 -> ( 5 == 5)
n( 6) - prod: 6, sum: 6 -> ( 6 == 6)
n( 7) - prod: 7, sum: 7 -> ( 7 == 7)
n( 8) - prod: 8, sum: 8 -> ( 8 == 8)
n( 9) - prod: 9, sum: 9 -> ( 9 == 9)
n(10) - prod: 0, sum: 1
n(11) - prod: 1, sum: 2
n(12) - prod: 2, sum: 3
n(13) - prod: 3, sum: 4
n(14) - prod: 4, sum: 5
n(15) - prod: 5, sum: 6
n(16) - prod: 6, sum: 7
n(17) - prod: 7, sum: 8
n(18) - prod: 8, sum: 9
n(19) - prod: 9, sum: 10
n(20) - prod: 0, sum: 2
n(21) - prod: 2, sum: 3
n(22) - prod: 4, sum: 4 -> ( 4 == 4)
n(23) - prod: 6, sum: 5
n(24) - prod: 8, sum: 6
n(25) - prod: 10, sum: 7
n(26) - prod: 12, sum: 8
n(27) - prod: 14, sum: 9
n(28) - prod: 16, sum: 10
n(29) - prod: 18, sum: 11
n(30) - prod: 0, sum: 3
如果我误解了您代码的目标,请发表评论,并帮助澄清您试图实现的目标。在思考您所做的事情后,会提示进行此编辑
示例使用/Output with如果((n==$((我的产品+我的总和)))
如果您实际上在寻找n
等于分解数字的乘积加和的等式,那么调整输出格式,您唯一的匹配项将是:
$ bash prodsum.sh
...
n(19) - prod: 9, sum: 10 (19 = 9 + 10)
...
n(29) - prod: 18, sum: 11 (29 = 18 + 11)
继续我的评论,在运行shell检查并没有错误之后,您仍然必须修复n++
,这本身就是一个错误。要增加n
,请使用((n++)
)
您也没有在while
循环的每次迭代中更新my_prod
和my_sum
。您对n=$((my_prod+my_sum))
的比较是可疑的。我怀疑您在if((my_prod==my_sum))之后
。这将允许您比较say22
的乘积和数字之和是否相等(例如2+2=2*2
)。更正这些将允许您的代码进行我认为您需要的比较,例如
n=0
while [ $n -le 30 ];
do
my_prod=$(prod $n)
my_sum=$(sum $n)
printf "n(%2d) - prod: %3d, sum: %3d" "$n" "$my_prod" "$my_sum"
if ((my_prod == my_sum))
then
# echo "$n -> product ($my_prod) == sum ($my_sum)"
printf " -> (%3d == %3d)" "$my_prod" "$my_sum"
fi
printf "\n"
((n++))
done
您可以清理prod
和sum
如下所示。注意为了避免调用循环中的实用程序(例如cut
等),这将产生单独的子进程,您可以简单地使用mod,除以10
逻辑来分解prod()中的数字
和sum()
,例如
sum() {
local len=${#1}
local res=0
local n=$1
local res=0
while [ $n -gt 0 ]
do
local sdigit=$(( n % 10 ))
local n=$(( n / 10 ))
local res=$(( res + sdigit ))
done
echo $res
}
prod() {
local len=${#1}
local res=1
local n=$1
while [ $n -gt 0 ]
do
local sdigit=$(( n % 10 ))
local n=$(( n / 10 ))
local res=$(( res * sdigit ))
done
echo $res
}
注意:如果使用支持字符串索引的类似shell的bash,则可以进一步将prod()
和sum()
缩减为:
sum() {
[ -z "$1" ] && {
echo 0
return 1
}
echo $(($1 + $1))
}
prod() {
[ -z "$1" ] && {
echo 0
return 1
}
echo $(($1 * $1))
}
将这些部分放在一起,您可以执行以下类似操作:
#!/bin/bash
sum() {
local len=${#1}
local res=0
local n=$1
local res=0
while [ $n -gt 0 ]
do
local sdigit=$(( n % 10 ))
local n=$(( n / 10 ))
local res=$(( res + sdigit ))
done
echo $res
}
prod() {
local len=${#1}
local res=1
local n=$1
while [ $n -gt 0 ]
do
local sdigit=$(( n % 10 ))
local n=$(( n / 10 ))
local res=$(( res * sdigit ))
done
echo $res
}
n=0
while [ $n -le 30 ];
do
my_prod=$(prod $n)
my_sum=$(sum $n)
printf "n(%2d) - prod: %3d, sum: %3d" "$n" "$my_prod" "$my_sum"
if ((my_prod == my_sum))
then
printf " -> (%3d == %3d)" "$my_prod" "$my_sum"
fi
printf "\n"
((n++))
done
示例使用/输出
在0-30
之间查找这些乘积和分解数之和,您会发现:
$ bash prodsum.sh
n( 0) - prod: 0, sum: 0 -> ( 0 == 0)
n( 1) - prod: 1, sum: 1 -> ( 1 == 1)
n( 2) - prod: 2, sum: 2 -> ( 2 == 2)
n( 3) - prod: 3, sum: 3 -> ( 3 == 3)
n( 4) - prod: 4, sum: 4 -> ( 4 == 4)
n( 5) - prod: 5, sum: 5 -> ( 5 == 5)
n( 6) - prod: 6, sum: 6 -> ( 6 == 6)
n( 7) - prod: 7, sum: 7 -> ( 7 == 7)
n( 8) - prod: 8, sum: 8 -> ( 8 == 8)
n( 9) - prod: 9, sum: 9 -> ( 9 == 9)
n(10) - prod: 0, sum: 1
n(11) - prod: 1, sum: 2
n(12) - prod: 2, sum: 3
n(13) - prod: 3, sum: 4
n(14) - prod: 4, sum: 5
n(15) - prod: 5, sum: 6
n(16) - prod: 6, sum: 7
n(17) - prod: 7, sum: 8
n(18) - prod: 8, sum: 9
n(19) - prod: 9, sum: 10
n(20) - prod: 0, sum: 2
n(21) - prod: 2, sum: 3
n(22) - prod: 4, sum: 4 -> ( 4 == 4)
n(23) - prod: 6, sum: 5
n(24) - prod: 8, sum: 6
n(25) - prod: 10, sum: 7
n(26) - prod: 12, sum: 8
n(27) - prod: 14, sum: 9
n(28) - prod: 16, sum: 10
n(29) - prod: 18, sum: 11
n(30) - prod: 0, sum: 3
如果我误解了您代码的目标,请发表评论,并帮助澄清您试图实现的目标。在思考您所做的事情后,会提示进行此编辑
示例使用/Output with如果((n==$((我的产品+我的总和)))
如果您实际上在寻找n
等于分解数字的乘积加和的等式,那么调整输出格式,您唯一的匹配项将是:
$ bash prodsum.sh
...
n(19) - prod: 9, sum: 10 (19 = 9 + 10)
...
n(29) - prod: 18, sum: 11 (29 = 18 + 11)
您是否已将代码运行过?if[$n-eq$((我的产品+我的金额))]
?或if((n==$((我的产品+我的金额)))
?谢谢!我不知道那个网站,肯定是书签。我修复了一些东西并将更新帖子。我现在已经通过shellcheck运行了整个脚本,现在只显示建议,没有错误。你的代码运行了吗?如果[$n-eq$((my_prod+my_sum))]
或者如果((n=$((my_prod+my_sum)))
?谢谢!我不知道那个网站,肯定是书签。我已经修复了一些东西,会更新的