直接说吧,我想让用户灵活地将参数传递给命令,以控制命令的运行方式,例如:
pcap -d 30 -w 2
换句话说:
我想创建一个看起来和 Linux 命令一模一样的命令。一个工作方式和 Linux 命令一模一样的命令。一个选项(即参数)与 Linux 命令风格相同的命令。
我想创建一个命令,该命令通过从用户那里获取参数或在用户未提供任何参数的情况下使用其默认参数(从配置文件中读取)来工作,就像任何其他 Linux 命令一样。
带有 --help 的命令显示不同的选项。
我知道如何在 Linux 中编写命令。但我不知道如何编写这些选项(命令参数)。我不知道这些参数是如何编程的。
指南、教程或示例即可
笔记:
- 如果这个问题在错误的堆栈中提出,请原谅。
- 另外,对于问题的先前版本,我深表歉意,因为它的表述很糟糕。
答案1
既然你提到了python
,python 的答案是:
如果你只是想为参数设置默认值,你可以简单地放该函数的默认值:
def show(val = 30):
print(val)
# to print the default value (30)
show()
# to show another value (e.g. 40)
show(40)
换句话说,如果你不提供任何参数,这将打印默认值,而它使用参数如果你给它。
更高级;从文件中读取默认值,并可选择通过给予论点
可以做同样的事情,但要从文件中读取默认参数。这样就可以在设置文件中设置参数,而不是在代码本身中编辑它们。
假设我有一个设置文件testconf.txt
:
length:4
height:7
width:6
...我想将这些值读入我的应用程序中默认参数,但用户能通过自定义参数推翻它们:
#!/usr/bin/env python3
import sys
# path to my config file
conf_file = "/home/jacob/Bureaublad/testconf.txt"
# read the default arguments from a file
def_args = [l.strip() for l in open(conf_file).readlines()]
# replace default args by possible custom args
cust_args = sys.argv[1:]
for cu in cust_args:
argname = cu.split(":")[0]
try:
match = [arg for arg in def_args if arg.startswith(argname)][0]
except IndexError:
print("incorrect argument: ", cu)
else:
def_args[def_args.index(match)] = cu
def get_arg(s):
return [val.split(":")[1] for val in def_args if val.startswith(s)][0]
l = get_arg("length")
w = get_arg("width")
h = get_arg("height")
print("l=", l, "w=", w, "h=", h)
现在我可以不带参数运行该脚本:
$ '/home/jacob/Bureaublad/pscript_4.py'
l= 4 w= 6 h= 7
或者宽度参数:
$ '/home/jacob/Bureaublad/pscript_4.py' length:10 height:456
l= 10 w= 6 h= 456
在此设置中,给定参数的顺序无关紧要。如果参数不正确:
$ '/home/jacob/Bureaublad/pscript_4.py' monkey
incorrect argument: monkey
l= 4 w= 6 h= 7
笔记
在“真实”软件中,您当然可以(并且应该)通过在设置文件不正确或丢失时添加警告来使其更加先进,然后决定要做什么,但这是基本思想。
编辑
从您的评论中,我了解到,从两个方面来看,上述答案还不是您想要的:
- 你想运行命令没有可执行文件(脚本)的路径及其扩展名,以及
- 您希望拥有更加“传统”的选项格式。
尽管[1]
已经在其他地方回答了,但我还是在这里做一个简短的解释:
1. 运行不带路径和扩展名的命令
您可以运行可执行文件和脚本没有必须包含脚本的路径,方法是可执行文件(chmod +x <files>
),并将其放置在$PATH。
在 Linux 上,扩大( .py
) 不起任何作用,因此您可以使用不带扩展名的脚本反正。
具体来说:
- 如果目录尚不存在,则创建该目录
~/bin
创建并保存脚本,完全按照原始答案中提到的那样,如
showsize
(无扩展)中所述~/bin
,并且使脚本可执行。注销/登录后,您可以通过以下命令简单地运行脚本:
showsize
2. 更改选项的格式
如上所述,您可以轻松更改选项的格式,例如:要解析选项,如下所示:
-l 23 -h 210 -w 321
如果在脚本中包含:
args = sys.argv[1:]
结果
args
将是一个列表:["-l", "23", "-h", "210", "-w", "321"]
现在我们要做的就是获取 的值
-h
,只需查找 的索引-h
,然后选择列表中的第一个下一个项目:height = args[args.index("-h")+1] print(height) > 210
在脚本中:
#!/usr/bin/env python3 import sys # path to my config file conf_file = "/home/jacob/Bureaublad/testconf.txt" # read the default arguments from a file def_args = [l.strip().split(":") for l in open(conf_file).readlines()] # replace default args by possible custom args cust_args = sys.argv[1:] for carg in cust_args: if carg in ["-l", "-h", "-w"]: for d in def_args: d[1] = cust_args[cust_args.index(carg)+1] if d[0] == carg else d[1] def get_arg(s): # fetch values from the list return [val[1] for val in def_args if val[0] == s][0] l = get_arg("-l") w = get_arg("-w") h = get_arg("-h") print("length =", l, "\nwidth =", w, "\nheight =", h)
如何使用
创建以下格式的设置文件:
-l:4 -h:7 -w:6
将脚本复制到一个空文件中,将其保存为
showsize
(无扩展名)在~/bin
或 中的其他任何地方$PATH
,然后使其可执行。在脚本的头部部分,设置设置文件的路径:
# path to my config file conf_file = "/home/jacob/Bureaublad/testconf.txt"
现在运行命令:
$ showsize length = 4 width = 6 height = 7
或者:
$ showsize -l 300 -h 345 -w 751 length = 300 width = 751 height = 345
答案2
脚本文件:
#!/bin/bash
# set default values
X=10
Y="lorem ipsum"
source ~/.myscript.conf
echo "X = $X, Y = $Y"
.myscript.conf 文件:
X=20
Y="something else"
现在,如果用户运行脚本文件并且其主目录中没有 .myscript.conf 文件,则脚本将使用 X=10 和 Y="lorem ipsum",如果有配置文件,它将使用文件中的值。
Source 命令在当前 shell 中执行作为参数给出的文件的内容,因此在这里,它将为 X 和 Y 分配新值,覆盖脚本文件中的默认值。
由于 ~ 指向用户主目录,因此此设置适用于系统上的任何用户(包括 root 用户)。
[编辑] 在您的具体例子中:
#!/bin/bash
X=10
Y=2
source ~/.config.conf
pcap -d $X -w $Y
答案3
猛击:与 Marek 的方法相同,使用用户的值获取文件,但要注意的是,该文件可以做任何事情,输入错误只会引起语法错误,因此这需要一些用户知识。您可以使用 getopts 解析命令行参数。
Python:请参阅 argparse 模块来解析命令行参数,以及 ConfigParser(v2) 和 configparser(v3) 来解析 .ini 文件。
通常,您会使用配置文件来处理不经常更改的内容,并使用命令行参数来处理每次运行时可能不同的内容。每次运行时编辑配置文件是一件非常麻烦的事情。