【发布时间】:2021-04-21 09:05:15
【问题描述】:
我想构建 Linux 命令find 的简化版本。
我正在使用一个结构数组来保存有关我从命令行获得的选项的数据:
struct my_option
{
short id; //
const char *option; // check valid/invalid option
short needs_arg; // check this options requires an argument
short opt_count; // count number of paths
int first_arg; // first argument
int last_arg; // last argument
};
static struct my_option opt[] =
{
{OPT_TYPE , "-type", REQUIRES_1_ARGUMENT, 0, 0, 0},
{OPT_USER , "-user", REQUIRES_1_ARGUMENT, 0, 0, 0},
{OPT_NOUSER , "-nouser", REQUIRES_NO_ARGUMENT, 0, 0, 0},
{OPT_GROUP , "-group", REQUIRES_1_ARGUMENT, 0, 0, 0},
{OPT_NOGROUP , "-nogroup", REQUIRES_NO_ARGUMENT, 0, 0, 0},
{OPT_NAME , "-name", REQUIRES_1_ARGUMENT, 0, 0, 0},
{OPT_PATH , "-path", REQUIRES_1_ARGUMENT, 0, 0, 0},
{OPT_PRINT , "-print", REQUIRES_NO_ARGUMENT, 0, 0, 0},
{OPT_LS , "-ls", REQUIRES_NO_ARGUMENT, 0, 0, 0},
{OPT_PATHLIST , 0, 0, 0, 0, 0},
/* OPT_PATHLIST has to be the last entry in the struct */
};
在opt[] 的最后一个索引中,您可以看到条目OPT_PATHLIST 和所有其他字段设置为0。
如果将多个路径传递给我的 find 命令,我想将它们保存到这个结构中,但我该怎么做呢?
我是否只使用保存实际路径字符串的全局字符串变量并将它们的地址保存到字段_option, _needs_arg, _opt_count, ... 中?我宁愿问,我什至可以这样做吗?将地址保存到任何类型的变量中?
一个例子是:
newfind /dev /etc -ls
其中应该打印两个目录/dev和/etc中文件的一些信息
如何将保存/dev 和/etc 的变量的字符串或地址保存到ID 为OPT_PATHLIST 的struct my_option 中
我考虑的另一个选择是:
从命令行输入循环路径
并将它们添加到char *option 上,这样字符串option 最终将是"/dev /etc",而不是使用多个变量作为路径。也许这样会更好更容易。
感谢您的帮助!我这样做是为了大学作业。 编辑:正如有人建议只使用 getopt(3),我不允许这样做。我正在实施 my_getopt()
【问题讨论】:
-
看来你是在重新发明轮子。见
getoptandgetopt_long。还有很多现有的库可以提供更高级的命令行选项解析。 -
使用linux.die.net/man/3/getopt 并为可能有多个实例的选项使用链表或指针数组
-
为什么要保存它们? argv 不会去任何地方。你只需要索引和计数。
-
我应该添加:我不允许使用 lib 函数 getopt :( argv 不会去任何地方是真的,我可能只是这样使用它,但这是我的任务,我讨厌说明,因为出于某种原因我必须这样做
-
你有什么指示?我不清楚你的限制是什么,哪些部分可以更改,哪些部分不能更改。