如何在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 1
或 return 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脚本中通过函数调用将参数/参数从一个函数传递到另一个函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何将传递给我的 bash 脚本的所有参数传递给我的函数? [复制]