如何在bash脚本中测试时使用函数返回值

时间:2015-04-03 03:21:36

标签: bash

这是我的代码摘要。我使用return_valfunc中的"true"之间的比较结果来确定while终止条件。但回声根本不起作用。

#!/bin/bash

func(){
    a=$1
    b=$2
    echo $a
    echo $b
    if ((a > b)) 
    then 
        return_val="true"
    else
        return_val="false"
    fi  
}

c=1
d=4
while [[ $(func $c $d) && ("$return_val"!="true") ]]
do
    ((c++))
done

3 个答案:

答案 0 :(得分:1)

我宁愿让函数返回一个值。

#!/bin/bash

func(){
    a=$1
    b=$2
    echo $a
    echo $b
    if ((a > b)) 
    then 
        return 0 # 0 means success
    else
        return 1 # non-zer0 means failure
    fi  
}

c=1
d=4
until (func $c $d) #While ! success, do something..
do
    ((c++))
done

注意:func $c $d周围的括号仅用于提高可读性。真的不需要。

答案 1 :(得分:1)

由于您希望查看echo命令的输出,您需要将 stdout输出 return(退出)代码分开:

#!/bin/bash

func(){
    local a=$1 b=$2
    echo "$a"  # stdout output
    echo "$b"
    if (( a > b ))  # see below for how this could be simplified.
    then 
        return 0 # set exit code
    else
        return 1
    fi  
}

c=1 d=4
while ! func $c $d
do
    ((c++))
done

这样,您可以直接使用函数(前缀为!来取消测试的结果),而无需替换命令,并让其返回(退出)代码驱动while循环条件的结果(退出代码0表示成功,任何其他意味着失败)。

仅使用! func $c $d作为条件,func的标准输出就会按原样打印。


附录Billy Wayne McCann's answer指出,没有严格要求使用显式return语句设置退出代码(但是没有#n}需要使用test [1] )。

(( a > b ))可以单独使用 作为函数中的最后一个语句,隐式设置退出代码

如果没有明确的return语句,则它是一个函数的 last 命令,用于设置其退出代码(这同样适用于脚本没有exit声明。)

(( ... ))将退出代码设置为1,如果...评估为0,则设置1(任何非负结果)。如果表达式为真,则a > b等布尔表达式会生成1,否则会生成0。因此,(( a > b ))本身隐含地执行上述if语句显式

func(){
    local a=$1 b=$2
    echo "$a"  # stdout output
    echo "$b"
    (( a > b ))  # exit code implicitly set to 0, if test *succeeds*, 1 otherwise
}

[1]使用test[ ... ]是符合POSIX标准的评估条件的方法。除非您的代码必须符合POSIX标准,否则Bash的[[ ... ]](( ... ))(对于算术布尔测试)是更好的选择 - 请参阅https://stackoverflow.com/a/29320710/45375 < / SUP>

答案 2 :(得分:1)

强制返回0或1并不是正确的方法。您希望返回测试的真实退出状态,而不是强制返回状态。实际上不需要if ... then块。

功能会自动返回退出状态。该函数的退出状态是最终语句的状态。因此,可以将test作为func中的最终陈述。

#!/usr/bin/env bash

func(){
    local a=$1 
    local b=$2
    test $a -lt $b  #use exit status directly
}

c=1 
d=4

while func $c $d  #while c is less than d
do
   ((c++)) 
done