击。继承函数范围

时间:2015-11-30 18:11:25

标签: bash scope

我需要一个全局计数器和函数,它会逐个返回数字。例如,我希望这个脚本回显6,7,8(但它回显6,6,6):

#!/bin/bash

port_counter=5

function get_free_port {
    port_counter=$((port_counter + 1))
    echo ${port_counter}
}

function foo {
    echo $(get_free_port)
}

foo
foo
(foo;)&

我如何获得6,7,8?

更新 好吧,经过chepner的回答,我需要指出一点我的问题。 如果我需要在get_free_port中使用foo作为变量,我不能使用这种方法,不是吗? 所以我不能写

function foo {
    variable=get_free_port # variable=$(get_free_port) was ok, but returns 6,6,6
    echo ${variable}
}

同样foo & - 像用法一样不可取

2 个答案:

答案 0 :(得分:5)

您无法修改子流程中的变量($(...)运行的变量)。在这种情况下你不需要一个:

function foo {
    get_free_port
}

但是,出于同样的原因,您也无法从子shell或后台作业调用foofoo &(foo)(foo)&都不会更新当前shell中port_counter的值。

如果您确实需要调用get_free_port 捕获其输出,则需要使用临时文件。例如:

foo () {
    get_free_port > some_temp_file
    cat some_temp_file
}

如果这不合适,您可能需要重新考虑脚本的设计。

答案 1 :(得分:1)

以下代码会为您提供所需的行为:

#!/bin/bash

port_counter=5

function get_free_port {
    port_counter=$(( port_counter + 1 ))
    echo ${port_counter}
}

function foo {
    get_free_port 
# $(get_free_port) spawns a subshell and the parent shell variables are not
# available in the subshell.
}

foo #runs fine
foo #runs fine
foo #(foo;)& again spawns a subshell and the parent shell pariables are not available here.