为什么shell脚本中的变量从python的结果工作奇怪



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

有人能帮我吗?提前感谢:)

如果你不引用你的扩展,它们是字符串分割和全局扩展。"全局扩展"意味着像*这样的东西被更改为文件名列表。

所以,引用:

echo "$PYTEST"

…将准确的输出作为单个字符串传递。

不引用:

echo $PYTEST

…将首先展开:

echo ** it is python testing **

…然后将** s更改为文件名列表,并且然后调用echo


请注意,即使没有globing,字符串分割也可能产生意想不到的效果。假设你的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,并且隐式地将扩展视为引号)。

最新更新