san*_*lio 3 command-line bash scripts functions
我的意思是:
scr.sh带有位置参数的bash 脚本
#!/bin/bash
echo "Params = $@"
echo REMOTE_SERVER=${REMOTE_SERVER}
Run Code Online (Sandbox Code Playgroud)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用括号将命令括起来,但它不起作用。
我怎样才能做到这一点?
如果只想为命令设置变量,请在命令前面加上赋值:
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)