在shell脚本中将bash变量传递给python命令

时间:2016-09-21 18:54:59

标签: python json bash

需要从JSON文件中每行提取两个变量,并在单独的后续命令中使用这两个变量中的每一个。

我的脚本到目前为止:

#!/bin/bash

VCTRL_OUT='/tmp/workingfile.json'

old_IFS=$IFS      # save the field separator
IFS=$'\n'     # new field separator, the end of line

for line in $(cat $VCTRL_OUT)
  do
    python -c 'import json,sys;obj=json.load($line);print obj["ip_range"]'
  done

倒数第二行是错误的,需要知道如何做到这一点。

以下作品:

cat /tmp/workingfile.json | head -n +1 | python -c 'import json,sys;obj=json.load(sys.stdin);print obj["ip_range"]';

但不确定如何在循环的bash脚本中执行相同的操作。

1 个答案:

答案 0 :(得分:3)

Python不会是我这种单行的首选,但你可以试试

#!/bin/bash

VCTRL_OUT='/tmp/workingfile.json'

parse_json () {
    python -c $'import json,fileinput,operator\nfor line in fileinput.input(): print "%s %s"%operator.itemgetter("ip_range","description")(json.loads(line))' "$1"
}
while IFS= read -r ip_range description; do
   # do your thing with ip_range
done < <(parse_json "$VCTRL_OUT")

另一种方法是用jq替换Python位:

while IFS= read -r ip_range description; do
  # ...
done < <( jq -rRc 'fromjson | .ip_range+" "+.description' "$VCTRL_OUT")

另一种替代方法是用Python替换整个bash脚本,尽管说起来容易做起来难,这取决于bash脚本实际上在做什么。