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

时间:2017-08-30 08:56:00

标签: bash ubuntu

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

/home/ubuntu/pub/access.txt

我在同一台计算机上有一个脚本文件应该读取并使用此SFTP_VAR="JHGSYDDUIGUIGUIGUIG" SQL_VAR="GUIIGGJHGBJHGJHGJH" 。我使用SFTP_VAR语句来提及 access.txt 的位置。这是我脚本文件中的代码。

source

当我运行脚本时,我在第一个#!/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

代码工作正常。我在这里缺少什么,如何在代码中读取这些变量?

2 个答案:

答案 0 :(得分:1)

编辑:在评论中进一步讨论时,发现引号存在问题,而不是会话问题。在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使用普通电话即可。然后看看标准输出。一切都应该在回声中描述。

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

第三步: 现在使用export script.sh再次调用脚本。输出应该看起来就像它在第一步中所做的那样。

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

为什么?

Bash基于不同的会话。您在开始会话后设置的内容不会转移到其他打开的会话,并且在您退出会话后将丢失。

只需输入bash即可开始新会话。但即使这样也无法解决我们的问题。

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

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

来看到它们

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

但这仍然只是暂时的,因为一旦我们关闭了我们采购脚本的会话,它们就会消失。

答案 1 :(得分:0)

Put things in double quotes. Your example ?- cantNodos(arbol(3,arbol(2,nil,nil),arbol(6,nil,arbol(8,nil,nil))),R). should work fine, but try the password "*".

?- cantNodos(arbol(3,arbol(2,nil,nil),arbol(6,nil,arbol(8,nil,nil))),R).
false.