如何在bash脚本中通过函数调用将参数/参数从一个函数传递到另一个函数[重复]

Posted

技术标签:

【中文标题】如何在bash脚本中通过函数调用将参数/参数从一个函数传递到另一个函数[重复]【英文标题】:How to pass args/parameters with a function call from one function to another in a bash script [duplicate] 【发布时间】: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,反之亦然。 【参考方案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"

以上是关于如何在bash脚本中通过函数调用将参数/参数从一个函数传递到另一个函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 C 中通过引用传递时会发生啥?

如何使用参数制作 Bash 函数? [复制]

从 bash 脚本中通过 ssh 在远程主机上执行命令

如何将传递给我的 bash 脚本的所有参数传递给我的函数? [复制]

如何将一些参数传递给 addEventListener 中调用的函数? [复制]

如何将参数从 bash 传递到 php 脚本?