热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

解析Shell的命令行参数

如何解决《解析Shell的命令行参数》经验,为你挑选了1个好方法。

我有一个要为一个夏季项目编写的shell。例如,我正在尝试解析命令行,

如果我打电话

ls -l

我需要解析

-l

部分。

因此,我可以将其传递给用于的参数向量execv。我知道我正确解析了它,但是由于某种原因,找不到目录。我可能想念什么吗?下面是我的代码。



1> rici..:

尽管strtok标准库功能可能很有用,但您需要了解其接口的缺点,这基本上是对粗心的陷阱。

在此程序中,您似乎偶然发现了strtok界面的两个最常见问题。请man strtok与该答案一起仔细阅读,以免将来陷入这些问题。另外,请勿将其strtok用作良好界面设计的示例。而是将其用作避免情况的模型:

隐藏的全球状态

strtok对保留在静态变量中的字符串指针进行操作。每当您strtok使用第一个非NULL参数进行调用时,它都会首先将此静态变量的值重置为该字符串。在对的每次调用结束时strtok,它将其静态变量设置为下一次扫描应开始的地址,该地址恰好在刚找到的令牌之后。

整个程序中只有一个静态变量实例,因此您不能交错strtok扫描两个不同的字符串。更糟糕的是,您无法调用本身strtokstrtok字符串扫描内调用的函数,因为该函数内的调用将重置strtok状态。

这意味着strtok在程序中进行多次扫描时,您必须格外小心。在您的情况下,在命名错误的变量初始化之后env

token = strtok(env, ":");

strtok可以将输入命令分为几个名字不完整的变量argv

argv = strtok(buf_copy, " ");

因此,当您以后想要查找的下一个组件时env

token = strtok(NULL, ":");

strtok的状态不再指向env; 相反,它指向buf_copy(并根据您的特定输入,在此位置buf_copy将找不到更多令牌)。

修改输入参数

的第一个参数strtok是a char*,而不是a const char*

通常,如果库函数具有字符串参数,则const char*除非函数打算修改字符串,否则应将参数声明为。或者,换句话说,const char*声明是一个承诺,即不会尝试修改该参数,如果没有做出承诺,则可能是有充分理由的。

而且,的确,如果您阅读strtok的文档,您会看到它通过用NUL字符覆盖一些分隔符来显式修改其输入字符串。这具有将原始字符串永久划分为单独标记的作用。有时候很好,但是如果您以后想再次引用字符串的原始值,可能会给您带来很多麻烦。通常,您会发现自己在复制原始字符串以进行调用strtok。(这通常是程序设计不当的征兆,或者信号strtok并不是真正用于解析的正确工具。)

在此特定程序中,陷阱是getenv()不返回环境变量值的副本。它直接将指针返回到环境变量表中。尽管返回类型getenvchar*,这可能使您认为修改值是可以的,但C标准显然告诉您不要:

指向的字符串不得由程序修改

不幸的是,Linux的manpage中没有禁止使用此功能getenv,但是该手册确实指出getenv了指向环境表的指针。如果您确实修改了所返回的字符串getenv,则很有可能(尽管不能保证)getenv对相同环境变量的后续调用将检索修改后的值。

这就是您要做的事情:由于您放开strtok了返回的字符串getenv(PATH),因此后续调用getenv(PATH)将看到一个值在第一个冒号处被截断。


推荐阅读
  • 本文详细介绍了在 CentOS 7 系统中配置 fstab 文件以实现开机自动挂载 NFS 共享目录的方法,并解决了常见的配置失败问题。 ... [详细]
  • Ping 命令的高级用法与技巧
    本文详细介绍了 Ping 命令的各种高级用法和技巧,帮助读者更好地理解和利用这一强大的网络诊断工具。 ... [详细]
  • 微软推出Windows Terminal Preview v0.10
    微软近期发布了Windows Terminal Preview v0.10,用户可以在微软商店或GitHub上获取这一更新。该版本在2月份发布的v0.9基础上,新增了鼠标输入和复制Pane等功能。 ... [详细]
  • window下的python安装插件,Go语言社区,Golang程序员人脉社 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • Ansible:自动化运维工具详解
    Ansible 是一款新兴的自动化运维工具,基于 Python 开发,集成了多种运维工具(如 Puppet、CFEngine、Chef、Func 和 Fabric)的优点,实现了批量系统配置、程序部署和命令执行等功能。本文将详细介绍 Ansible 的架构、特性和优势。 ... [详细]
  • 使用虚拟机配置服务器
    本文详细介绍了如何使用虚拟机配置服务器,包括购买云服务器的操作步骤、系统默认配置以及相关注意事项。通过这些步骤,您可以高效地配置和管理您的服务器。 ... [详细]
  • 基于Linux开源VOIP系统LinPhone[四]
    ****************************************************************************************** ... [详细]
  • 近期在研究逆向工程,因此尝试了一些CTF题目。通过合天网络安全实验室的CTF实战演练平台(http://www.hetianlab.com/CTFrace.html),我对Linux逆向工程的掌握还不够深入,因此暂时跳过了RE300题目。首先从逆向100开始,将文件后缀名修改为.apk进行初步分析。这一过程不仅帮助我熟悉了基本的逆向技巧,还加深了对Android应用结构的理解。 ... [详细]
  • 如何在虚拟机中实现Linux与Windows主机之间的文件夹共享
    为了在虚拟机中实现Linux与Windows主机之间的文件夹共享,首先需要确保Linux系统已安装VMware Tools。如果尚未安装,可以通过虚拟机软件提供的“安装VMware Tools”选项进行安装。安装完成后,通过配置共享文件夹设置,即可实现主机与虚拟机之间的文件互传。此外,建议检查虚拟机网络设置,确保网络连接正常,以提高文件传输的稳定性和速度。 ... [详细]
  • Linux核心目录解析及其功能概述 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • Crontab 是 Linux 系统中用于设置定时任务的强大工具。为了高效地管理和使用 Crontab,首先需要编写相应的 Shell 脚本来定义具体的任务逻辑。此外,还需要对 Crontab 进行适当的配置,以确保任务能够按时准确地执行。本文将详细介绍如何编写和管理 Crontab 定时任务,包括常见的配置选项和最佳实践,帮助用户提高任务调度的效率和可靠性。 ... [详细]
  • Shell脚本编译器的全面解析与应用指南 ... [详细]
  • Linux系统中默认安装目录有哪些?Tomcat在Linux下的默认安装路径是什么?
    在Linux系统中,默认安装目录通常包括 `/usr`, `/opt`, 和 `/var` 等。对于Tomcat而言,在Linux下的默认安装路径通常是 `/opt/tomcat` 或者 `/usr/local/tomcat`。具体路径可能会因不同的发行版和配置而有所差异。例如,在Ubuntu Server中,Tomcat的默认安装路径通常是 `/opt/tomcat`。这些目录的选择旨在确保系统的整洁性和可维护性。 ... [详细]
author-avatar
梦亦碎i
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有