如果与Shell脚本的总和和乘积匹配,则打印数字

如果与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

我的脚本有语法错误,我确定我有逻辑集,但脚本的格式似乎有问题

预期的工作流是

如果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 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))之后
。这将允许您比较say
22
的乘积和数字之和是否相等(例如
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))之后
。这将允许您比较say
22
的乘积和数字之和是否相等(例如
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)))
?谢谢!我不知道那个网站,肯定是书签。我已经修复了一些东西,会更新的