微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

bash – shell脚本中的混合代码.共享变量

This answer讨论了如何从终端中的命令行运行多行Python片段.我注意到答案在shell脚本中很有用,即使是嵌套缩进,这非常好,例如

#!/bin/bash
some_text="Hello world"
echo $some_text

cat <<EOF | python -
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
EOF

打印:

0 
hello
hello
1
hello
hello
2
hello
hello

但是,我很难在shell脚本和Python片段之间共享变量.

>如何在bash脚本中收集python下标的输出? (例如在$output等变量中).
>如何将bash变量(例如$some_text)传递给Python脚本?

解决方法:

获取Python的变量

由于(当没有引用EOF标记时)变量替换发生在将文本从heredoc传递到python的标准输入之前,您可以在脚本中正确抛出变量.

python - <<EOF
some_text = "$some_text"
EOF

如果some_text被测试,python会看到some_text =“test”.但请注意,它可以被视为代码注入漏洞.如果some_text是“; import os; os.system(”evil-command“); x =”,例如,python会看到:

some_text = ""; import os; os.system("evil-command"); x = ""

并运行那个邪恶的命令.

如果您希望能够将Python代码直接引入脚本而不进行任何修改,则可以导出变量.

export some_text

并使用os.environ来检索它.

some_text = os.environ['some_text']

这是一种更安全/更安全的方法.

从Python获取输出

您可以使用命令替换来收集脚本的输出.

output=$(
python - <<EOF
import sys;
for r in range(3):
  print r
  for a in range(2):
    print "hello"
EOF
)

(请注意,所有尾随的换行符都已删除)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐