首页 百科知识 怎样在单个命令行中运行多个命令

怎样在单个命令行中运行多个命令

时间:2022-10-17 百科知识 版权反馈
【摘要】:“命令行”就是为启动程序而在操作系统状态下输入的表示命令的字符行。其实这些命令行参数在C语言编写的程序中也可以实现,处理这一类带参数的命令行时,可以有效地提高程序的运行效率,收到事半功倍的效果。在程序启动后正式开始执行前,每个命令行参数被自动做成一个字符串,程序里可以按规定方式使用这些字符串,以接受和处理各个命令行参数。

*6.7 命令行参数

要启动一个程序,基本方式是在操作系统命令状态下由键盘输入一个命令。操作系统根据命令名去查找相应的程序代码文件,把它装入内存并令其开始执行。“命令行”就是为启动程序而在操作系统状态下输入的表示命令的字符行。

例如,在常见微机系统中,如果源程序文件名是abcd.c,经过编译通常产生出名为abcd.exe的可执行程序文件,在命令状态下输入命令:

  abcd

这个程序就会装入执行。“abcd”就是命令行。

在要求执行一个命令(程序)时,所提供的命令行里往往不仅是命令名,可能还需要提供另外的信息,例如在DOS系统里,要用系统的编辑器编辑一个文件,我们可能输入“edit file1.txt”这样的命令行。在命令行中,edit是命令(程序)名,而文件名file1.txt就是命令的附加信息,即命令行的参数。

许多应用软件运行时都带有命令行参数,例如DIR A:等之类带有盘符、路径或文件名的命令行。其实这些命令行参数在C语言编写的程序中也可以实现,处理这一类带参数的命令行时,可以有效地提高程序的运行效率,收到事半功倍的效果。

当然,目前许多操作系统采用图形用户界面,在要求执行程序时,常常不是通过命令行形式发出命令,而是通过点击图标或菜单项等。但实际的命令行仍然存在,它们存在于图标或菜单的定义中,例如,在许多系统里可以把某个文件拖到一个程序文件那里作为程序的启动参数,实际上这就是要求系统产生一个实现这种命令的命令行。此外,要建立程序项和命令菜单项等,也需要写出实际命令行,其中包括提供所需要的各个命令行参数。

现在,人们经常在集成开发环境(IDE)里开发程序,程序的编辑、调试和执行等工作都可以在同一个环境里完成。这时如何为执行程序提供命令行参数呢?实际上,集成开发环境都有专门的机制为启动命令行提供参数,请读者自己找一找,查查系统手册。提供命令行参数另一种方法是转到开发环境之外,在操作系统的命令行状态下启动程序,例如启动一个命令式交互的窗口,在命令窗口里执行程序。

C程序通过main的参数获取命令行参数信息。前面程序中的main函数都没有参数,那就表示它们不处理命令行参数。实际上main可以有两个参数,这时的原型是:

  int main(int argc,char*argv[]);

人们常用argc、argv作为main两个参数的名字。当然,根据对函数性质的了解,我们应该知道,这两个参数完全可以用任何其他名字,但它们的类型是确定的。只要我们在定义main函数写出上面这样类型正确的函数原型,就能保证在程序启动执行时正确得到有关命令行参数的信息。

命令行参数中的argc表示命令行参数的个数(包括可执行程序名本身),argv[]定义为指向字符串常量的指针数组,数组元素是分别指向命令行中可执行文件名和各命令行参数字符串的指针。因此,argv[0]为命令行中可执行程序名本身,argv[1]为命令行中第一个参数的内容,依次类推,例6-22输出命令行参数的个数及参数的内容如例6-22所示。

例6-22 输出命令行参数的个数及参数的内容。

img556

下面我们阐述C语言的命令行参数机制。处理程序的命令行参数很像处理函数的参数。因为,写这种程序时需要考虑的是如何处理将来别人输入命令行、执行这个程序时所提供的信息。就像在定义函数时,要考虑的是处理函数被调用时提供的信息。两者确实很像。要写能处理命令行参数的程序,需要了解C程序如何看待命令行。这里总把命令行中的字符看成由空格分隔的若干字段,每字段是一个命令行参数。命令名本身是编号为0的参数,后面的参数依次编号。在程序启动后正式开始执行前,每个命令行参数被自动做成一个字符串,程序里可以按规定方式使用这些字符串,以接受和处理各个命令行参数。

当一个用C 编写的程序被装入内存准备执行时,main 的两个参数首先被自动给定初值:argc 的值是启动命令行中的命令行参数的个数;指针argv(前面讲过,数组参数实际是指针参数)指向一个字符指针数组,这个数组里共有argc+1 个字符指针,其中的前argc个指针分别指向表示各命令行参数的字符串,最后是一个空指针,表示数组结束。

例如,如下的命令行:

  prog1 there are five arguments

img557

图6.7.1 命令行参数现场情况

当程序执行进入主函数main 时,与命令行参数有关的现场情况如图6.7.1所示。其中main的整型参数argc保存着5,指针参数argv指向一个包含6 个成员的字符指针数组,其中前5个指针分别指向相应字符串,最后是一个空指针。这些都是在main 开始执行前自动建立的。这样,在函数main 里就可以通过argc和argv访问命令行的各个参数了:由argc可得到命令行参数的个数,由argv 可以找到各个命令行参数字符串。通过编号为0的参数还可以访问启动程序的命令名本身。

例6-23 显示课程名和上课时间的程序。

程序如下:

img558

如果经编译、连接后的可运行程序为6-23.exe,则有:

  c:\〉6-23 Monday Friday

运行结果:

  DATA STRUCTURE------- Monday

  OPERATING SYSTEM------- Friday

程序中argv作如下定义:

  char*argv[];

其中,空的方括号表示数组长度是可变的,其长度与使用命令行字符串实参的个数有关,这样可以由argv指向多个实参。本例中,当输入命令行后,操作系统和编译程序将根据字符串常量参数的个数和字符串常量的起始地址对argc和argv[ ]进行初始化,argc为3,如果命令行中没有输入两个命令行实参,程序返回。使argv[0]指向6-23.exe文件,argv[1]指向第一个实参Monday,argv[2]指向第二个实参Friday。Exit(0)函数的功能是终止程序的运行,返回操作系统运行环境。

需要注意的是,命令行实参之间必须用空格分隔,不能用“,”和“;”等符号分隔。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈