我试图从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,并且隐式地将扩展视为引号)。