如果它与Shell脚本的总和和产品匹配,则打印编号

时间:2017-05-31 22:42:57

标签: shell if-statement while-loop sum product

我的脚本出现语法错误,我确信我已经设置了逻辑,但似乎遇到了脚本格式化的问题。

预期的工作流程是

如果n =((sum)+(产品))则打印n和n ++重复。 否则n ++重复。

public class MenuListFragment extends Fragment {

    private ImageView ivMenuUserProfilePhoto;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_menu, container,
                false);
        ivMenuUserProfilePhoto = (ImageView) view.findViewById(R.id.ivMenuUserProfilePhoto);
        NavigationView vNavigation = (NavigationView) view.findViewById(R.id.vNavigation);
        vNavigation.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {
                //Toast.makeText(getActivity(),menuItem.getTitle(),Toast.LENGTH_SHORT).show();

// here is where I need to reload the tab from, and pass the the "cat" value


                return false;
            }
        }) ;
        setupHeader();
        return  view ;
    }

    private void setupHeader() {
        int avatarSize = 20;
        String profilePhoto = "";

    }

}

2 个答案:

答案 0 :(得分:1)

((expression))将执行算术运算,但不会返回任何内容,因此无效:

# 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)) ))

答案 1 :(得分:1)

继续我的评论,在您运行shell检查并且没有错误之后,您仍然必须修复n++,这本身就是一个错误。要增加n,请使用((n++))

my_prod循环的每次迭代中,您也没有更新my_sumwhile。您对n == $((my_prod + my_sum))的比较是可疑的。我怀疑你在if ((my_prod == my_sum))之后。这样您就可以比较产品和说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

您可以清除prodsum,类似于以下内容。 注意以避免在循环中调用实用程序(例如cut等),这会生成单独的子进程,您可以简单地使用mod, divide by 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
}

注意:如果使用类似bash的shell支持字符串索引,则可以进一步将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

如果我误解了您的代码的目标,请发表评论并帮助澄清您要实现的目标。在考虑了你在做什么之后,提示了这个编辑。

示例使用/输出 if ((n == $((my_prod + my_sum))))

如果您实际上正在寻找等于n等于产品加上总和分解数字的等式,那么调整输出格式,只有匹配是:

$ bash prodsum.sh
...
n(19) - prod:   9, sum:  10  (19 =  9 + 10)
...
n(29) - prod:  18, sum:  11  (29 = 18 + 11)