我的意思是:
scr.sh
采用位置参数的bash 脚本#!/bin/bash echo "Params = $@" echo REMOTE_SERVER=${REMOTE_SERVER}
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 内部,将部分代码包含在外部。