将环境变量传递给 bash 脚本,从函数内部调用

将环境变量传递给 bash 脚本,从函数内部调用

我的意思是:

  1. scr.sh采用位置参数的bash 脚本

    #!/bin/bash
    echo "Params = $@"
    echo REMOTE_SERVER=${REMOTE_SERVER}
    
  2. f在另一个脚本中定义的Bash 函数scr2.sh

    #!/bin/bash
    f() {
        REMOTE_SERVER=s001
        scr.sh "${@}"
    }
    

我首先

$ source scr2.sh

然后可以f在命令行中调用,但是没有留下我所做之事的痕迹REMOTE_SERVER。例如,我想要

$ f par1 par2
par1 par2
s001
$ echo REMOTE_SERVER=${REMOTE_SERVER}
REMOTE_SERVER=

(实际上,如果REMOTE_SERVER在使用之前设置了f,我希望它保留该值)。我无法实现最后一个目标。我总是以REMOTE_SERVER设置结束。我尝试使用用分号分隔的多行命令,f用括号括住命令,但没有成功。

我怎样才能做到这一点?

答案1

如果只想为命令设置变量,请将赋值添加到命令的前缀:

REMOTE_SERVER=s001 scr.sh "${@}"

或者,为函数使用子 shell(这样变量赋值就不会影响父 shell)。您可以通过将命令包裹在( ... )(括号)中或使用括号代替大括号来创建子 shell。例如,使用:

foo () (
    REMOTE_SERVER=s001
)
bar () {
    REMOTE_SERVER=s001
}
foo; echo "REMOTE_SERVER=$REMOTE_SERVER"; bar; echo "REMOTE_SERVER=$REMOTE_SERVER"; 

我的输出是:

REMOTE_SERVER=
REMOTE_SERVER=s001

答案2

使用

#!/bin/bash
f() {
    (
        REMOTE_SERVER=s001
        scr.sh "${@}"
    )
}

工作正常。这可能相当于已接受的答案,但具有额外的灵活性,可以将部分代码包含在本地 shell 内部,将部分代码包含在外部。

相关内容