我试图从python的结果中获取bash shell中的变量。 这是我的python代码:
print '** it is python testing **'
我制作了一个shell脚本。当我正常使用时,它会显示非常正确的结果。
#!/bin/bash
python pytest.py
结果:
** it is python testing **
但是,当我把它作为shell中的变量时,它显示出奇怪的结果。 这是脚本:
#!/bin/bash
#python pytest.py
PYTEST="$(python pytest.py)"
echo $PYTEST
然后结果看起来像这样:
ptest.sh pytest.py it is python testing ptest.sh pytest.py
我从其他复杂的代码尝试过,但结果几乎相同。 shell脚本中的变量始终显示目录中的一些文件。我不擅长shell脚本,但无法理解原因。 (我使用的是GNU bash,4.1.10版本)
有人可以帮助我吗? 在此先感谢:)
答案 0 :(得分:6)
如果你没有引用你的扩展,那么它们就是字符串拆分和全局扩展。 “全局扩展”意味着*
之类的内容会更改为文件名列表。
所以,引用:
echo "$PYTEST"
...会将确切的输出作为单个字符串传递。
不引用:
echo $PYTEST
...将首先展开:
echo ** it is python testing **
...然后将**
更改为文件名列表,然后调用echo
。
请注意,即使没有通配,字符串拆分也会产生意外效果。假设您的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,并隐含地将扩展视为引用它们。)