python - 为什么来自 python 结果的 shell 脚本中的变量工作奇怪?

标签 python linux bash shell

我试图从 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/

相关文章:

json - 如何在以下输出中获取过去 7 天的信息

Python 多词索引

python - 存储 int 显示标签?枚举

python - 将字典键指定为数据框名称,将值指定为数据框本身

python - 在Python中重新排列数字列表

python - 从 python 脚本运行进程,进程永远不会停止

r - 如何在 Linux 上从 R 访问 Olap-Cubes

python - 尝试从华为调制解调器读取消息时出现错误 125002

linux - 为什么 bash 文档建议引用通配符?

Bash:在while循环后保留变量的值