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

san*_*lio 3 command-line bash scripts functions

我的意思是:

  1. scr.sh带有位置参数的bash 脚本

    #!/bin/bash
    echo "Params = $@"
    echo REMOTE_SERVER=${REMOTE_SERVER}
    
    Run Code Online (Sandbox Code Playgroud)
  2. f在另一个脚本中定义的bash 函数scr2.sh

    #!/bin/bash
    f() {
        REMOTE_SERVER=s001
        scr.sh "${@}"
    }
    
    Run Code Online (Sandbox Code Playgroud)

我首先会

$ source scr2.sh
Run Code Online (Sandbox Code Playgroud)

然后f可以在命令行调用,但不会留下我对REMOTE_SERVER. 例如,我想要

$ f par1 par2
par1 par2
s001
$ echo REMOTE_SERVER=${REMOTE_SERVER}
REMOTE_SERVER=
Run Code Online (Sandbox Code Playgroud)

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

我怎样才能做到这一点?

mur*_*uru 5

如果只想为命令设置变量,请在命令前面加上赋值:

REMOTE_SERVER=s001 scr.sh "${@}"
Run Code Online (Sandbox Code Playgroud)

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

foo () (
    REMOTE_SERVER=s001
)
bar () {
    REMOTE_SERVER=s001
}
foo; echo "REMOTE_SERVER=$REMOTE_SERVER"; bar; echo "REMOTE_SERVER=$REMOTE_SERVER"; 
Run Code Online (Sandbox Code Playgroud)

我的输出是:

REMOTE_SERVER=
REMOTE_SERVER=s001
Run Code Online (Sandbox Code Playgroud)