我希望使用我的shell脚本调用多种形式的命令行选项.
我知道getopts可以使用,但就像在Perl中一样,我无法对shell做同样的事情.
关于如何做到这一点的任何想法,以便我可以使用如下选项:
./shell.sh --copyfile abc.pl /tmp/
./shell.sh -c abc.pl /tmp/
Run Code Online (Sandbox Code Playgroud)
在上面,两个命令对我的shell意味着相同的东西,但使用getopts,我还没有能够实现这些?
我注意到Python 2.7文档包含另一个命令行解析模块.除了getopt和optparse我们现在有argparse.
为什么还创建了另一个命令行解析模块?我为什么要用它而不是optparse?是否有我应该了解的新功能?
在C中,getopt_long不会解析命令行参数参数的可选参数.
当我运行程序时,无法识别可选参数,如下面的示例运行.
$ ./respond --praise John
Kudos to John
$ ./respond --blame John
You suck !
$ ./respond --blame
You suck !
Run Code Online (Sandbox Code Playgroud)
这是测试代码.
#include <stdio.h>
#include <getopt.h>
int main(int argc, char ** argv )
{
int getopt_ret, option_index;
static struct option long_options[] = {
{"praise", required_argument, 0, 'p'},
{"blame", optional_argument, 0, 'b'},
{0, 0, 0, 0} };
while (1) {
getopt_ret = getopt_long( argc, argv, "p:b::",
long_options, &option_index);
if (getopt_ret == -1) break;
switch(getopt_ret)
{
case 0: break;
case 'p': …Run Code Online (Sandbox Code Playgroud) while getopts "hd:R:" arg; do
case $arg in
h)
echo "usgae"
;;
d)
dir=$OPTARG
;;
R)
if [[ $OPTARG =~ ^[0-9]+$ ]];then
level=$OPTARG
else
level=1
fi
;;
\?)
echo "WRONG" >&2
;;
esac
done
Run Code Online (Sandbox Code Playgroud)
level是指参数-R,dir是指参数-d
当我输入 ./count.sh -R 1 -d test/它正确的工作
当我输入./count.sh -d test/ -R 1它正确的工作
但我想在输入./count.sh -d test/ -R或输入时使其工作./count.sh -R -d test/
这意味着我想要-R一个默认值,命令序列可以更灵活.
我想在bash脚本中支持短期和长期选项,因此可以:
$ foo -ax --long-key val -b -y SOME FILE NAMES
Run Code Online (Sandbox Code Playgroud)
可能吗?
我试图在Windows下编译一组九个*.c文件(以及九个相关的*.h文件).
该代码最初是在Linux中设计的,用于使用标准GNU-Linux/C库"getopt.h"获取命令行参数.该库不适用于在Windows中构建C代码.
我想忽略我的代码现在所做的事情并提出以下问题.对于那些熟悉这个C库"getopt.h"的人:如果它依赖于POSIX风格的命令行参数,是否可以在Windows中构建和运行我的代码?或者我是否必须重新编写适用于Windows的代码,以不同方式传递输入文件(并放弃"getopt.h"依赖关系)?
我正在为c#寻找一个getopt库.到目前为止,我发现了一些(phpguru,XGetOptCS,getoptfordotnet),但这些看起来更像未完成的尝试,只支持C的getopt的一部分.是否有完整的getopt c#实现?
是否可以使用getopt或optparse为一个选项获取多个值,如下例所示:
./hello_world -c arg1 arg2 arg3 -b arg4 arg5 arg6 arg7
Run Code Online (Sandbox Code Playgroud)
请注意,每个选项(-c,-b)的实际值数可以是1或100.我不想使用:
./hello_world -c "arg1 arg2 arg3" -b "arg4 arg5 arg6 arg7"
在我看来,这可能是不可能的(也许违反了POSIX),如果我错了,请纠正我.
我已经看到了一些例子,其中./hello_world -c arg1 -b arg1 arg2 arg3可以收集line()末尾的所有非选项......但不是第一个多选项.
我希望我的应用程序可以在不同的Python版本的各种平台上工作,所以我没有看过argparser.
如何在Python中使用getopt/optarg?
好的,所以PHP有一个内置的getopt()函数,它返回有关用户提供的程序选项的信息.只是,除非我遗漏了什么,否则它完全被淹没了!从手册:
选项的解析将在找到的第一个非选项时结束,后面的任何内容都将被丢弃.
因此,getopt()返回一个仅包含有效和已解析选项的数组.您仍然可以通过查看看到整个原始命令行$argv,它仍未修改,但您如何判断该命令行中何处getopt()停止解析参数?如果您想将命令行的其余部分视为其他内容(例如,文件名),则必须知道这一点.
这是一个例子......
假设我想设置一个脚本来接受以下参数:
Usage: test [OPTION]... [FILE]...
Options:
-a something
-b something
-c something
Run Code Online (Sandbox Code Playgroud)
然后我可以这样打电话getopt():
$args = getopt( 'abc' );
Run Code Online (Sandbox Code Playgroud)
而且,如果我像这样运行脚本:
$ ./test.php -a -bccc file1 file2 file3
Run Code Online (Sandbox Code Playgroud)
我应该期望将以下数组返回给我:
Array
(
[a] =>
[b] =>
[c] => Array
(
[0] =>
[1] =>
[2] =>
)
)
Run Code Online (Sandbox Code Playgroud)
所以问题是:在地球上我应该知道三个未解析的非选项FILE参数从$argv[ 3 ]??? 开始