将变量从一个脚本传递到另一个脚本

将变量从一个脚本传递到另一个脚本

如何在脚本之间传递变量?

示例:我有两个测试脚本:

-- test2.sh
#!/bin/bash
echo "this is test2.sh"
echo "varname is $varname"
echo end

-- tes1.sh
#!/bin/bash 
varname="123456"
ssh [email protected] 
"bash" < varname=$varname test2.sh

我的想法是,我运行test1.sh它连接到远程服务器,并执行test2.sh.但我得到的只是varName is 123456: No such file or directory

答案1

你为什么不把它作为一个参数传递呢? IE。

测试2.sh

#!/bin/bash
echo "this is test2.sh"
echo "varName is $1"
echo end

测试1.sh

#!/bin/bash 
varName="123456"
scp test2.sh [email protected]:/tmp/
ssh [email protected] "/tmp/test2.sh $varName"
ssh [email protected] "rm -f /tmp/test2.sh"

答案2

我认为您遇到了“操作顺序”类型的问题。<在执行命令之前对其进行处理,因此您正在运行类似的东西(尽管不完全相同)

varname=$varname test2.sh | ssh [email protected] bash

test2.sh在本地运行,然后将该输出发送到bash远程服务器。这就是为什么您会看到 的输出,test2.sh但当它尝试将该输出作为命令执行时却收到错误。

如果您正在运行一个可执行的脚本,那么您实际上并不需要那里bash,所以您可以这样做

ssh [email protected] "varname=$varname ./test2.sh"

假设test2.sh在远程服务器上可用。

如果您没有test2.sh远程服务器并且仍然想在那里执行它,您可以这样做:

ssh [email protected] varname="$varname" bash < test2.sh

bash这将重定向脚本源,但在可执行文件的上下文中进行变量处理

答案3

要在命令行上定义进程的环境,您需要对定义进行排序命令:

varname=$varname bash < $varname test1.sh

在我看来,您似乎不太可能真的想打开一个名为...的文件。

varname=${expansion_of_varname}

尽管这似乎是您正在尝试做的事情。我预计这也会引起问题。如果你想每一个变量赋值来影响所有 shell 子级的环境,那么你可以这样做:

set -a

...第一的。(尽管如此,如果x=; <${x:=file} sh -c 'echo "$x"'没有中间分号,似乎仍然无法工作)

相关内容