我有一个bash脚本,该脚本使用参数调用python脚本。 在bash脚本中,我正在读取一个文件,该文件包含用“,”分隔的一行参数,然后使用我所读取的行调用python脚本。 我的问题是python获取的参数由空格分隔。
该行如下所示:“ param_a”“ Param B”“ Param C” 代码示例:
Bash脚本:
LINE=`cat $tmp_file`
id=`python /full_path/script.py $LINE`
Python脚本:
print sys.argv[1]
print sys.argv[2]
print sys.argv[3]
收到的输出:
"param_a"
"Param
B"
想要的输出:
param_a
Param B
Param C
如何将参数发送到所需的Python脚本中? 谢谢!
答案 0 :(得分:1)
那
id=`python /full_path/script.py $tmp_file`
和
import sys
for line in open(sys.argv[1]):
print(line)
?
答案 1 :(得分:1)
问题在于bash如何传递参数。 Python与它无关。
因此,您必须先解决所有这些问题,然后再将其发送给Python,我决定为此使用awk和xargs。 (但是xargs是这里的实际MVP。)
LINE=$(cat $tmp_file)
awk -v ORS="\0" -v FPAT='"[^"]+"' '{for (i=1;i<=NF;i++){print substr($i,2,length($i)-2)}}' <<<$LINE |
xargs -0 python ./script.py
第一个$(..)优于反引号,因为它更具可读性。毕竟,您正在制作一个变量。
awk
仅从stdin或文件中读取,但是您可以使用<<<(也称为“此处为字符串”)强制其从变量中读取。
使用awk
循环遍历所有字段(由FPAT变量中的正则表达式定义),并打印不带“”的字段。
我选择的输出记录分隔符是NULL字符(-v ORF ='\ 0'),xargs将在此字符上分割。
xargs
现在将通过将参数分隔为NULL字符(用-0设置)来解析管道输入,并执行使用已解析参数给出的命令。
注意,虽然在大多数UNIX系统上都可以找到awk,但我使用的是FPAT,它是GNU awk扩展名,您可能没有将GNU awk作为默认值(例如Ubuntu),但是gnu awk通常只是一个{{ 1}}。
此外,下一条命令将是一种快速简便的解决方案,但通常被认为是不安全的,因为install gawk
将执行接收到的所有指令。
eval
答案 2 :(得分:1)
这可以使用bash
数组来完成:
tmp_file='gash.txt'
# Set IFS to " which splits on double quotes and removes them
# Using read is preferable to using the external program cat
# read -a reads into the array called "line"
# UPPERCASE variable names are discouraged because of collisions with bash variables
IFS=\" read -ra line < "$tmp_file"
# That leaves blank and space elements in "line",
# we create a new array called "params" without those elements
declare -a params
for((i=0; i < ${#line[@]}; i++))
do
p="${line[i]}"
if [[ -n "$p" && "$p" != " " ]]
then
params+=("$p")
fi
done
# `backticks` are frowned upon because of poor readability
# I've called the python script "gash.py"
id=$(python ./gash.py "${params[@]}")
echo "$id"
gash.py
:
import sys
print "1",sys.argv[1]
print "2",sys.argv[2]
print "3",sys.argv[3]
礼物:
1 param_a
2 Param B
3 Param C