无法访问 bash 脚本函数中的配置文件变量



我有一个配置和一个主要的bash脚本文件。配置文件具有分配有值的变量,而主文件想要访问它们。以下是我的文件,

config.sh

#!/bin/bash
username=abc
password=abc
hosts=(192.168.110.164);
walletname=varsh

main.sh

#!/bin/bash
source ~/shell/config.sh
echo "$username"
echo "$walletname"
start_block(){
echo "$username"
echo "$walletname"
}
SCRIPT="$(declare -f); start_block"
for i in ${!hosts[*]} ; do
printf "t=========== Logging in ${hosts[i]} ===========nn"
SCR=${SCRIPT/PASSWORD/${password}}
sshpass -p ${password} ssh -l ${username} ${hosts[i]} "${SCR}"
done

可以从start_block函数外部访问$username$walletname,但不能从函数内部访问。函数start_block的回显给出空结果。我尝试在配置中的变量名称之前使用export。如何访问这些变量?

编辑:

我想使用用户名密码登录到另一台主机,创建一些文件,使用配置文件变量运行安装和其他命令。配置中可能有很多变量。

您的变量不会发送到远程主机。您可以强制内联它们,就像执行以下函数一样:

SCRIPT="$(env) ; $(declare -f) ; start_block"

但是,我建议直接内联配置:

SCRIPT="$(cat ~/shell/config.sh) ; $(declare -f); start_block"

当您执行ssh -l ${username} ${hosts[i]} "${SCR}"时,将执行该函数。因此,它是在单独的进程中执行的,甚至很可能在不同的主机上执行。当然,你在那里看不到你的 shell 变量。实际上,令人惊讶的是,在远程端,start_block不会引发命令未找到错误,因为该函数也仅存在于本地进程中。

至于变量,您可以将它们转换为环境变量(通过使用export命令),并使用 ssh 配置文件中的SendEnvAcceptEnv选项,例如此处所述。

最新更新