Bash 来自另一个文件的变量已在脚本中回显但无法识别

Bash 来自另一个文件的变量已在脚本中回显但无法识别,bash,ubuntu,Bash,Ubuntu,我在一个名为access.txt的文件中有一个变量,位于/home/ubuntu/pub/access.txt。access.txt内容如下所示: SFTP_VAR="JHGSYDDUIGUIGUIGUIG" SQL_VAR="GUIIGGJHGBJHGJHGJH" 我在同一台机器上有一个脚本文件,应该读取并使用这个SFTP\u VAR。我使用source语句提到access.txt的位置。这是我脚本文件中的代码 #!/bin/bash source /home/ubuntu/pub/acc

我在一个名为access.txt的文件中有一个变量,位于
/home/ubuntu/pub/access.txt
。access.txt内容如下所示:

SFTP_VAR="JHGSYDDUIGUIGUIGUIG"
SQL_VAR="GUIIGGJHGBJHGJHGJH"
我在同一台机器上有一个脚本文件,应该读取并使用这个
SFTP\u VAR
。我使用
source
语句提到access.txt的位置。这是我脚本文件中的代码

#!/bin/bash

source /home/ubuntu/pub/access.txt
echo $SFTP_VAR
export SSHPASS=$SFTP_VAR
for f in /home/ubuntu/pub/sfmc/Upstream/Encrypted/* ; 
do 
    echo put "$f"
done | sshpass -e sftp -o StrictHostKeyChecking=no -o HostKeyAlgorithms=+ssh-dss USERNAME@FTP_SERVER_IP:/Import
unset SSHPASS
当我运行脚本时,我会在第一个
echo
中看到变量。这意味着我的脚本可以看到该文件。但是,在第一次回显之后的
export
命令似乎无法识别我的变量。这是当我用实际值替换变量时,或者:

echo 'JHGSYDDUIGUIGUIGUIG'
export SSHPASS='JHGSYDDUIGUIGUIGUIG'

代码运行良好。我在这里遗漏了什么?我如何读取代码中的变量?

编辑:在评论中的进一步讨论中,发现是引用问题,而不是会话问题。将access.txt文件中的双引号更改为单引号解决了OP的问题

我将在下面留下我的原始答案


你的问题措辞很糟糕。我想我看到了你的问题,但我不确定

您可能对源代码和导出的工作方式以及它们对会话的影响有一些误解。让我们测试一下:

首先创建一个包含此内容的文件,并在脚本的第6行给出路径:

VAR1="value of VAR1"
VAR2="value of VAR2"
然后创建名为script.sh的脚本:

#!/bin/bash
echo "[The variables with the name VAR1 and VAR2 are undefined in out session]"
echo "VAR1: "$VAR1
echo "VAR2: "$VAR2

echo "[Source brings the variables of the file into our session, with them VAR1 and VAR2]"
source /home/X/access.txt

echo "[VAR1 and VAR2 of our session do now have the values specified in the file]"
echo "VAR1: "$VAR1
echo "VAR2: "$VAR2

echo "[A third undefined variable is used - empty]"
echo "VAR3: "$VAR3

echo "[The third variable gets the value of VAR1 and is exported]"
export VAR3=$VAR1

echo "[The third variale is now filled]"
echo "VAR3: "$VAR3

echo "[We unset the variable]"
unset VAR3

echo "[The variable is no longer set]"
echo "VAR3: "$VAR3

echo "[Set it again]"
export VAR3=$VAR1

echo "[Its back now]"
echo "VAR3: "$VAR3
我想它涵盖了你想做的一切。现在开始测试:

第一步: 只需对其使用普通调用
bash script.sh
。然后看看这个标准。正如echos所描述的,一切都应该在那里

第二步: 现在,从您以前调用脚本的shell中尝试
echo$VAR3
。它不应该打印任何东西。脚本完成后,变量没有保存其值

第三步: 现在使用
export script.sh
再次调用脚本。输出的外观应该与第一步中的一样

第四步: 现在再次尝试
echo$VAR3
。它现在将打印变量


这是为什么?

Bash基于不同的会话。启动会话后设置的内容不会保留到其他打开的会话中,并且在退出会话后将丢失

只需键入
bash
即可启动新会话。但即使这样也不能解决我们的问题

调用脚本时,使用
bash script.sh
。这实际上也会启动一个新会话,然后在此会话中执行脚本。不是在你叫它的那个

完成后,它退出此会话,留下设置的变量。这就是为什么简单地使用
bash script.sh

在第三步中,我们使用
source
调用脚本。这将使变量进入会话,因此我们可以打印出值


但这仍然使它们只是暂时的,因为一旦我们结束了获取脚本的会话,它们就会消失。

用双引号括起来。您的示例应该可以正常工作,但请尝试使用密码“*”


如果包含导出的脚本被执行,并且没有源代码,那么逻辑将永远不会工作,我不会完全遵循。源文件中的值会被回显,但不会在
export
命令中读取。该值将被导出为是,但在脚本执行后,导出变量的shell将被终止,因此您需要在当前shell中运行。看看我的答案是否合理如果你在导出后和取消设置SSHPASS之前执行echo“$SSHPASS”,你会得到什么?123我在echo中得到我想要的值,即“jhgsyduiguigig”。我只是不明白为什么我的
export
语句没有认识到这一点。感谢您如此详细和微妙的描述和指导。我上面的代码以
source
命令开头。这是为了将变量加载到脚本中。我说得对吗?但是为什么当我
导出
我的一个变量时,即使我
在这两个变量之间什么都没有取消设置,我还是什么也得不到呢?我的
源代码
导出
不是同一会话的一部分吗?我收到了大量关于我做错了什么的信息。但是没有人告诉我应该在我的剧本中修改什么,我不知道我是否应该为这些浪费的时间而哭泣。当我将(“)改为(”)时,问题就解决了在我的
access.txt
。看看你花在我的问题上的时间,我真的不介意你把它作为答案发布。嗯,这很奇怪。你确定那些真的是双引号吗?也许你的编码有问题,因为它应该同时使用两个引号。我使用了双引号,现在用单引号测试了它,没有完全是引号。单引号有效,非单引号无效。编辑:当然这并不是浪费时间。现在你知道你可能需要检查引号的类型。这很重要,我以前也遇到过问题。这可能是因为我在窗口上编写bash脚本,服务器是Ubuntu。但这也是一个问题奇怪的是,我在记事本++上更改了操作系统的类型。是的,在Ubuntu上用编辑器检查你使用的所有文件。但它只有在我用单引号括起来时才起作用!
#  Incorrect
SFTP_VAR="*"; export SSHPASS=$SFTP_VAR;   echo $SSHPASS
# Correct
SFTP_VAR="*"; export SSHPASS="$SFTP_VAR"; echo "$SSHPASS"