【问题标题】:How to pass args/parameters with a function call from one function to another in a bash script [duplicate]如何在bash脚本中通过函数调用将参数/参数从一个函数传递到另一个函数[重复]
【发布时间】:2019-02-23 02:50:55
【问题描述】:

我试图弄清楚如何在同一个 bash 脚本中将一个函数调用的参数从一个函数传递到另一个函数。这是我到目前为止所得到的:

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

function isiteven {
    if (( "$element%2"=="0" ))
    then
        echo 1
    fi
}

function nevens {
    local result=0
    for element in $@
    do
        if (( $(isiteven) == 1 ))    # $(isiteven "$element")
        then
           result=$result+1
        fi
    done

    echo $result
}

我尝试在 isiteven 函数中调用 $(isiteven) 并在 %2==0 前面硬编码 $element。我已经尝试通过函数调用传递参数,$(isiteven $element)$(isiteven "$element"),但是我不确定我应该在 %2==0 前面编写什么代码来进行数学运算。

我在专用机器上使用 Ubuntu 18.04。

【问题讨论】:

  • 顺便说一句,如果你定义了isiteven() { (( ( $1 % 2 ) == 0 )); },那么你可以写if isiteven "$element"; then。这是因为函数的默认返回值为$?,而if 在返回值上分支。这比让你的函数写入标准输出,然后需要通过使用子外壳来捕获标准输出(因此需要 FIFO 设置和一个 fork 来创建子外壳)更有效。
  • ...查看在ideone.com/mQgodw运行的代码
  • @CharlesDuffy 你甚至可以使用isiteven() (( $1%2 == 0 ))
  • @KarlBaker 这是因为函数体是一个复合命令,其中包括条件构造(参见this article)。虽然要知道一个巧妙的花絮,但我认为在任何环境中使用它是不可取的,因为在任何环境中,除了您之外的任何人都会查看您的 shell 代码,因为广大大多数人会感到困惑,而且它真的只节省了几次击键。
  • @KarlBaker 是的,您上面的描述是准确的。 (有一些小问题——严格来说,$? 是一个特殊的参数,而不是变量——但你描述的所有重要方面都是正确的)。涉及到一点魔法:对于 UNIX 退出代码(存储在 $? 中),0 为真,所有其他数字为假(这就是为什么 exit 1return 1 用于脚本中的错误),但在算术上下文 0 为假,所有正整数为真。这在 (( )) 如何将其数字结果转换为 UNIX 退出代码中得到了解决:(( 1 ))$? 设置为 0,反之亦然。

标签: arrays bash function


【解决方案1】:

就像您为脚本所做的那样。

# Just an example to indicate to how to pass arguments.
isiteven() {
    echo "Command line arguments: $@"
}

nevens() {
    declare result=0
    declare element
    for element in "$@"; do
       # Do necessary logic here. 
       isiteven "$element"
    done
}

【讨论】:

  • 考虑 POSIX 而不是 ksh 函数语法:isiteven() { 而不是 function isiteven { 在 POSIX 系列 shell 中更便携。
  • 顺便说一句,result=$result+1 会将result=1 更改为result=1+1。也许您的意思是result=$((result+1)),将其更改为result=2
  • 我只是在解决他/她传递论点的主要问题,而不是看他的逻辑。你说的对。现在会修复它。
  • 谢谢@CharlesDuffy,它解决了我在增量器上的第二个(未说明的)问题。您对声明函数的 POSIX 语法的建议很有帮助,因为我读过这只是个人喜好问题。
  • @VivekAkupatni,谢谢,我的脚本适用于 if isiteven "$element"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-23
  • 2014-10-23
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
  • 2012-10-26
相关资源
最近更新 更多