执行带有参数的python脚本的Bash文件

时间:2019-07-18 19:21:41

标签: bash shell unix

我有一个带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脚本将无法工作。

1 个答案:

答案 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路径中保留反斜杠)。
  • 使用小写或大小写混合的变量名,以避免与shell或环境变量可能发生冲突
  • 在真实脚本中,使用有意义的变量名
  • 如果您尝试读取密码,则如果密码可能在输入文件中包含字段分隔符,并且很可能在密码中包含单引号,则使用此技术将会遇到问题。
  • 请注意,即使我省略了$d周围的引号,我的Python文件中仍然得到了单引号