为什么shell脚本中的变量从python的结果看起来很奇怪?

时间:2014-06-13 01:29:22

标签: python linux bash shell

我试图从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版本)

有人可以帮助我吗? 在此先感谢:)

1 个答案:

答案 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,并隐含地将扩展视为引用它们。)