在我看来,有几种方法可以从Bash函数返回值。

方法1 :使用“本地全局”变量,该变量在调用方中定义为local:

func1() {
    a=10
}

parent1() {
    local a

    func1
    a=$(($a + 1))
}

方法2 :使用命令替换:
func2() {
    echo 10
}

parent2() {
    a=$(func2)
    a=$(($a + 1))
}

与方法2相比,使用方法1可以提高多少速度?

而且,我知道像方法1中那样使用全局变量并不是一种好的编程习惯,但是出于效率方面的考虑,在某个时候是否可以证明其合理性?

最佳答案

Shell脚本中最昂贵的操作就是派生。任何涉及到 fork 的操作(例如命令替换)将比不涉及 fork 的操作慢1-3个数量级。

例如,这是一种循环的简单方法,该循环以file-1234的形式读取一堆生成的文件,并使用file-去除sed前缀,总共需要三个fork(命令替换+两阶段管道):

$ time printf "file-%s\n" {1..10000} |
     while read line; do n=$(echo "$line" | sed -e "s/.*-//"); done

real    0m46.847s

这是一个循环,它与参数扩展功能相同,不需要 fork :
$ time printf "file-%s\n" {1..10000} |
     while read line; do n=${line#*-}; done

real    0m0.150s

分支版本需要300倍的时间。

因此,您的问题的答案是肯定的:如果效率很重要,则您有充分的理由提出分解或替换派生代码的理由。

当派生计数相对于输入而言是恒定的(或者太杂乱而无法使其恒定),并且代码仍然太慢时,那就是您应该使用较快的语言重写它的时候。

关于bash - 当效率很重要时从函数返回值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29716774/

10-12 05:19