我正在尝试创建一个 bash 脚本,它将自己的参数传递给 python 脚本。我希望它像这样工作。
如果我这样运行它:
script.sh latest
然后在 bash 脚本中,它运行一个带有“最新”参数的 python 脚本,如下所示:
python script.py latest
同样,如果使用参数 123 运行 bash 脚本,则 python 脚本如下:
python script.py 123
谁能帮我理解如何做到这一点?
在这种情况下,诀窍是传递您拥有的任何参数,包括没有参数的情况,并保留原始命令行中存在的任何分组。
因此,您希望这三种情况起作用:
script.sh # no args
script.sh how now # some number
script.sh "how now" "brown cow" # args that need to stay quoted
没有真正的自然方法可以做到这一点,因为 shell 是一种宏语言,所以他们添加了一些神奇的语法,只适用于 DTRT。
#!/bin/sh
python script.py "$@"
在 pythonscript中script.py
用于getopt.getopt(args, options[, long_options])
获取参数。
例子:
import getopt, sys
def main():
try:
opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
except getopt.GetoptError as err:
# print help information and exit:
print str(err) # will print something like "option -a not recognized"
usage()
sys.exit(2)
output = None
verbose = False
for o, a in opts:
if o == "-v":
verbose = True
elif o in ("-h", "--help"):
usage()
sys.exit()
elif o in ("-o", "--output"):
output = a
else:
assert False, "unhandled option"
# ...
if __name__ == "__main__":
main()
一个非常好的内置解析器是 argparse。哟可以如下使用它:
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
const=sum, default=max,
help='sum the integers (default: find the max)')
args = parser.parse_args()
print(args.accumulate(args.integers))
在 bash 中,传递给脚本的参数使用$#
符号访问(# 是一个数字。使用 $# 完全一样应该给你传递的参数的数量)。因此,如果您想传递参数:
调用脚本:
`#script.sh argument`
在脚本中:
python script.py "$1"