AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1027693
Accepted
Jedidja
Jedidja
Asked: 2018-04-24 23:19:00 +0800 CST2018-04-24 23:19:00 +0800 CST 2018-04-24 23:19:00 +0800 CST

shell函数计算偶数的错误

  • 772

对于作业,我必须编写一个函数,当提供一系列数字时打印偶数的数量。

我使用了我用于之前分配的一段代码(1当数字是偶数和0奇数时打印)

我现在的问题是我的功能一直在打印0。我究竟做错了什么?

这是我的脚本:

#!/usr/bin/bash
# File: nevens.sh

# Write a function called nevens which prints the number of even numbers when provided with a sequence of numbers.
# Check: input nevens 42 6 7 9 33 = output 2

function nevens {

        local sum=0

        for element in $@
        do
                let evencheck=$(( $# % 2 ))
                if [[ $evencheck -eq 0 ]]
                then
                        let sum=$sum+1
                fi
        done

        echo $sum
}
scripts bash functions
  • 3 3 个回答
  • 3890 Views

3 个回答

  • Voted
  1. dessert
    2018-04-24T23:34:49+08:002018-04-24T23:34:49+08:00

    您只是忘记在循环$#中用 ( $)替换:elementfor

    function nevens {
      local sum=0
      for element in $@; do
        let evencheck=$(( element % 2 ))
        if [[ $evencheck -eq 0 ]]; then
          let sum=sum+1
        fi
      done
      echo $sum
    }

    现在来测试功能:

    $ nevens 42 6 7 9 33
    2
    $ nevens 42 6 7 9 33 22
    3
    $ nevens {1..10..2} # 1 to 10 step 2 → odd numbers only
    0
    $ nevens {2..10..2} # 2 to 10 step 2 → five even numbers
    5
    
    • 20
  2. Best Answer
    muru
    2018-04-24T23:52:12+08:002018-04-24T23:52:12+08:00

    @dessert找到了核心问题,我来做一些代码审查:

    1. shebang:/usr/bin/bash在 Ubuntu 中没有。是/bin/bash。
    2. 很好,您声明sum local了 ,并避免污染函数外部的变量命名空间。-i此外,您可以使用以下选项将其声明为整数变量:

      local -i sum=0
      
    3. 总是引用你的变量(和参数)!在这个脚本中这不是必需的,但要养成一个非常好的习惯:

      for element in "$@"
      do
      

      也就是说,你可以省略in "$@"这里:

      for element
      do
      

      如果in <something>未给出,则for循环隐式循环参数。这样可以避免忘记引号等错误。

    4. 无需计算然后检查结果。您可以直接在 中进行计算if:

      if (( (element % 2) == 0 ))
      then
          ((sum = sum + 1))
      fi
      

      (( ... ))是算术上下文。它比[[ ... ]]执行算术检查更有用,另外你可以省略$之前的变量(这使得它更容易阅读,恕我直言)。

    5. 如果将偶数检查部分移到单独的函数中,它可能会提高可读性和可重用性:

      function evencheck
      {
          return $(( $1 % 2 ))
      }
      function nevens
      {
          local -i sum=0
          for element
          do
              # `if` implicitly checks that the returned value/exit status is 0
              if evencheck "$element"
              then
                  (( sum++ ))
              fi
          done
          echo "$sum"
      }
      
    • 18
  3. Digital Trauma
    2018-04-25T15:08:18+08:002018-04-25T15:08:18+08:00

    我不确定您是否愿意接受其他解决方案。另外,我不知道您是否可以使用外部实用程序,或者您是否仅限于 bash 内置程序。例如,如果您可以使用grep,您的功能可能会简单得多:

    function nevens {
        printf "%s\n" "$@" | grep -c '[02468]$'
    }
    

    这会将每个输入整数放在自己的行上,然后用于grep计算以偶数结尾的行。


    更新 - @PeterCordes 指出我们甚至可以在没有 grep 的情况下执行此操作 - 只需纯 bash,只要输入列表只包含格式良好的整数(没有小数点):

    function nevens{
        evens=( ${@/%*[13579]/} )
        echo "${#evens[@]}"
    }
    

    这通过创建一个evens通过过滤掉所有赔率调用的列表来工作,然后返回该列表的长度。

    • 4

相关问题

  • 如何每 5 秒运行一次脚本?

  • 如何将必须从其自己的目录中运行的程序添加到面板或主菜单?

  • 如何编写 shell 脚本来安装应用程序列表?

  • Mac OS X Automator 的替代品?

  • 备份 bash 脚本未压缩其 tarball

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve