如何在脚本之间传递变量?
示例:我有两个测试脚本:
-- 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"'
没有中间分号,似乎仍然无法工作)。