加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在shell脚本中读取python变量?

发布时间:2020-12-15 22:43:34 所属栏目:安全 来源:网络整理
导读:我的 python文件有以下两个变量: week_date = "01/03/16-01/09/16"cust_id = "12345" 我如何将其读入一个接受这两个变量的shell脚本? 我当前的shell脚本需要手动编辑“dt”和“id”.我想将python变量读入shell脚本,这样我就可以编辑我的python参数文件而不
我的 python文件有以下两个变量:

week_date = "01/03/16-01/09/16"
cust_id = "12345"

我如何将其读入一个接受这两个变量的shell脚本?

我当前的shell脚本需要手动编辑“dt”和“id”.我想将python变量读入shell脚本,这样我就可以编辑我的python参数文件而不是那么多文件.

shell文件:

#!/bin/sh

dt="01/03/16-01/09/16" 
cust_id="12345"

在一个新的python文件中,我可以导入参数python文件.

解决方法

考虑类似于以下内容:

#!/bin/bash
#      ^^^^ NOT /bin/sh,which doesn't have process substitution available.

python_script='
import sys
d = {}                                    # create a context for variables
exec(open(sys.argv[1],"r").read()) in d  # execute the Python code in that context
for k in sys.argv[2:]:
  print "%s" % str(d[k]).split("")[0] # ...and extract your strings NUL-delimited
'

read_python_vars() {
  local python_file=$1; shift
  local varname
  for varname; do
    IFS= read -r -d '' "${varname#*:}"
  done < <(python -c "$python_script" "$python_file" "${@%%:*}")
}

然后您可以将其用作:

read_python_vars config.py week_date:dt cust_id:id
echo "Customer id is $id; date range is $dt"

…或者,如果您不想在阅读时重命名变量,只需:

read_python_vars config.py week_date cust_id
echo "Customer id is $cust_id; date range is $week_date"

好处:

>不像一个天真的基于正则表达式的解决方案(这将解决Python解析的一些细节 – 尝试教sed处理原始和常规字符串,以及单引号和三引号,而不是将其变成毛球!)或者类似的方法使用Python子进程的换行分隔输出,这将正确处理任何对象,str()给出的表示没有您的shell脚本可以使用的NUL字符.
>通过Python解释器运行内容也意味着您可以以编程方式确定值 – 例如,您可能有一些Python代码要求您的版本控制系统提供相关内容的最后更改日期.

想想这样的场景:

start_date = '01/03/16'
end_date = '01/09/16'
week_date = '%s-%s' % (start_date,end_date)

…使用Python解释器来解析Python意味着您不会限制人们将来如何更新/修改Python配置文件.

现在,让我们来谈谈:

>如果您的Python代码有副作用,那么这些副作用显然会生效(就像您选择将文件作为模块导入Python一样).不要使用它从您不信任其内容的文件中提取配置.
> Python字符串是Pascal风格的:它们可以包含文字NUL. shell语言中的字符串是C风格的:它们由第一个NUL字符终止.因此,Python中可能存在一些变量,而不能在没有非文字转义的情况下在shell中表示.为了防止str()表示包含NUL的对象溢出到其他赋值中,此代码在其第一个NUL处终止字符串.

现在,我们来谈谈实现细节.

> ${@ %%:*}是$@的扩展,它修改了每个参数中的第一个:之后的所有内容,因此只将Python变量名称传递给解释器.类似地,${varname#*:}是一个扩展,它修剪所有内容,包括第一个:从传递给read的变量名.见the bash-hackers page on parameter expansion.
>使用<(python ...)是进程替换语法:<(...)表达式求值为一个文件名,当读取该文件名时,将提供该命令的输出.使用< <(...)重定向该文件的输出,从而重定向该命令(第一个<是重定向,而第二个是<(开始进程替换的标记)的一部分.使用此表单获取输出一段时间的读取循环避免了BashFAQ #24 (“I set variables in a loop that’s in a pipeline. Why do they disappear after the loop terminates? Or,why can’t I pipe data to read?”)中提到的错误.
> IFS = read -r -d”构造具有一系列组件,每个组件使得读取行为更加真实于原始内容:

>在命令持续时间内清除IFS可防止从变量内容的末尾修剪空白.
>使用-r可以防止文本反斜杠被读取本身消耗而不是在输出中表示.
>使用-d”将空字符串”的第一个字符设置为记录分隔符.由于C字符串是NUL终止的,而shell使用C字符串,因此该字符是NUL.这可确保变量的内容可以包含任何非NUL值,包括文字换行符.

有关从bash中的字符串中读取面向记录的数据的过程的更多信息,请参阅BashFAQ #001 (“How can I read a file (data stream,variable) line-by-line (and/or field-by-field)?”).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读