我有一个带4个参数的python脚本。最后一个参数必须用单引号引起来。我有一个txt / csv文件,其中的参数以明文形式存储。我想使用bash脚本运行它。在解析单引号时出现错误,因为bash无法识别输入参数形式的单引号。
文本文件中将有4列:
文本/ CSV文件:
Col1 Col2 Col3 Col4
ABC C:\nihar\document3 abc 'jkl'
DEF C:\nihar\document2 d3f 'opq'
123 C:\nihar\document1 a89 '012'
(在文本格式中,分隔符将为空格,在csv中将为逗号)
注意:Col3和Col4中也有特殊字符。
bash file:
./testpython.py $A $B $C $D
where $A = Col1, $B = Col2, $C = Col3, $D = Col4.
识别单引号很难,因此给我一个错误,因为col4是密码,必须使用单引号。
PS:我无法更改python文件中的任何内容。因此,python文件应该保持不变。
这是我尝试过的:
#!/bin/bash
while read A B C D
do
./testpython.py $A $B $C $D
done < file.csv
还在第四行尝试了这些:
./testpython.py $A $B $C \'$D\'
./testpython.py $A $B $C "'$D'"
./testpython.py $A $B $C "$D"
./testpython.py $A $B $C ''$D''
当我将$ D替换为实际值,即'jkl'时,它起作用了。 当我尝试执行脚本时,该列没有显示我需要的单引号。如果该值不在单引号中,则python脚本将无法工作。
答案 0 :(得分:1)
在Bash中,始终引用变量。
为您的Python程序使用数据文件和以下替代程序:
#!/usr/bin/python3
import sys
count = 0
for arg in sys.argv:
print('arg {}: <{}>'.format(count, arg))
count+=1
并像这样修改您的Bash脚本:
#!/bin/bash
while read -r a b c d
do
if ((count++)) # skip the first line of the csv file
then
printf -- '--- line %d ---\n' "$count"
./testpython.py "$a" "$b" "$c" "$d"
fi
done < file.csv
我得到以下输出:
--- line 2 ---
arg 0: <./args.py>
arg 1: <ABC>
arg 2: <C:\nihar\document3>
arg 3: <abc>
arg 4: <'jkl'>
--- line 3 ---
arg 0: <./args.py>
arg 1: <DEF>
arg 2: <C:\nihar\document2>
arg 3: <d3f>
arg 4: <'opq'>
--- line 4 ---
arg 0: <./args.py>
arg 1: <123>
arg 2: <C:\nihar\document1>
arg 3: <a89>
arg 4: <'012'>
显示第4列内容周围的单引号。
其他说明:
-r
几乎总是与read
一起使用(在这种情况下,它会在Windows路径中保留反斜杠)。$d
周围的引号,我的Python文件中仍然得到了单引号