我试图从 python 的结果中获取 bash shell 中的变量。 这是我的 Python 代码:
print '** it is python testing **'
然后我制作了一个 shell 脚本。当我正常制作时,它显示非常正确的结果。
#!/bin/bash
python pytest.py
结果:
** 是python测试**
但是,当我将它作为 shell 中的变量时,它显示出奇怪的结果。 这是脚本:
#!/bin/bash
#python pytest.py
PYTEST="$(python pytest.py)"
echo $PYTEST
那么结果是这样的:
ptest.sh pytest.py 是python测试ptest.sh pytest.py
我从其他复杂的代码中尝试过,但结果几乎相同。 shell脚本中的变量总是显示目录中的一些文件。我不擅长 shell 脚本,但不明白为什么。 (我使用的是 GNU bash,4.1.10 版本)
有人能帮帮我吗? 提前致谢:)
最佳答案
如果您不引用您的扩展,它们将被字符串拆分和全局扩展。 “全局扩展”意味着像 *
这样的东西被更改为文件名列表。
所以,引用:
echo "$PYTEST"
...会将准确的输出作为单个字符串传递。
不引用:
echo $PYTEST
...将首先扩展:
echo ** it is python testing **
...然后会将 **
更改为文件名列表,然后然后调用 echo
。
请注意,即使没有 globbing,字符串拆分也会产生意想不到的效果。假设您的 Python 程序执行了以下操作:
print " it is python testing"
您可能希望 echo $PYTEST
在这种情况下可以正常工作……但是,您会看到它删除了前导空格:
> echo $PYTEST
it is python testing
为什么?因为字符串拆分将输入分解为单词,并将每个单词作为单独的参数传递给 echo,echo 将其参数连接在一起,每个参数之间有一个空格。
因此,就像下面删除空格一样:
> echo it is python testing
it is python testing
...在符合 POSIX 的 shell 中,不带引号的扩展也是如此。 (顺便说一下,zsh 在这方面不遵守 POSIX,并且隐含地将扩展视为引用)。
关于python - 为什么来自 python 结果的 shell 脚本中的变量工作奇怪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24196421/