c语言模拟shell命令行解释程序
Shell脚本语言简介

Shell语言简介简介:Shell Script,Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。
但是它比Windows下的批处理更强大,比用其他编程程序编辑的程序效率更高,毕竟它使用了Linux/Unix下的命令。
换一种说法也就是,shell script是利用shell的功能所写的一个程序,这个程序是使用纯文本本件,将一些shell的语法与指令写在里面,然后用正规表示法,管线命令以及数据流重导向等功能,以达到我们所想要的处理目的。
更明白的来说,shell script就像早期dos年代的.bat,最简单的功能就是将许多指令汇整写一起,让使用者很容易的就能够一个操作执行多个命令,而shell script更是提供了数组,循环,条件以及逻辑判断等重要功能,让使用者可以直接以shell来写程序,而不必使用类似C程序语言等传统程序编写的语法。
shell和shell脚本的区别:shell是什么呢?确切一点说,Shell就是一个命令行解释器,它的作用就是遵循一定的语法将输入的命令加以解释并传给系统。
它为用户提供了一个向Linux发送请求以便运行程序的接口系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。
Shell 本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。
Shell既是一种命令语言,又是一种程序设计语言(就是你所说的shell脚本)。
作为命令语言,它互动式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。
它虽然不是Linux系统内核的一部分,但它调用了系统内核的大部分功能来执行程序、创建文档并以并行的方式协调各个程序的运行。
当命令不在命令行执行时,而是从一个文件中执行时,该文件就称为shell脚本,脚本以非交互方式运行。
Shell脚本编写基础

Shell本身是一个用C语言编写的程序,它是用户使用Linux的桥梁。
Shell既是一种命令语言,又是一种程序设计语言。
作为命令语言,它交互式地解释和执行用户输入的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
它虽然不是Linux系统核心的一部分,但它调用了系统核心的大部分功能来执行程序、建立文件并以并行的方式协调各个程序的运行。
因此,对于用户来说,shell 是最重要的实用程序,深入了解和熟练掌握shell的特性极其使用方法,是用好Linux系统的关键。
可以说,shell使用的熟练程度反映了用户对Linux使用的熟练程度。
一、什么是shell当一个用户登录Linux系统之后,系统初始化程序init就为每一个用户运行一个称为shel l(外壳)的程序。
那么,shell是什么呢?确切一点说,shell就是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell 来启动、挂起、停止甚至是编写一些程序。
当用户使用Linux时是通过命令来完成所需工作的。
一个命令就是用户和shell之间对话的一个基本单位,它是由多个字符组成并以换行结束的字符串。
shell解释用户输入的命令,就象DOS里的所做的一样,所不同的是,在DOS中,只有一个,而在Linux下比较流行的shell有好几个,每个shell都各有千秋。
一般的Linux系统都将bash作为默认的shell。
二、几种流行的shell目前流行的shell有ash、bash、ksh、csh、zsh等,你可以用下面的命令来查看你自己的shell类型:#echo $SHELL$SHELL是一个环境变量,它记录用户所使用的shell类型。
你可以用命令:#shell-name来转换到别的shell,这里shell-name是你想要尝试使用的shell的名称,如ash等。
Shell脚本编程详解-吐血共享

第12章 Shell 脚本编程●Shell 命令行的运行 ●编写、修改权限和执行Shell 程序的步骤 ●在Shell 程序中使用参数和变量 ●表达式比较、循环结构语句和条件结构语句 ● 在Shell 程序中使用函数和调用其他Shell 程序12-1 Shell 命令行书写规则◆ Shell 命令行的书写规则对Shell 命令行基本功能的理解有助于编写更好的Shell 程序,在执行Shell 命令时多个命令可以在一个命令行上运行,但此时要使用分号(;)分隔命令,例如:[root@localhost root]# ls a* -l;free;df长Shell 命令行可以使用反斜线字符(\)在命令行上扩充,例如: [root@localhost root]# echo “this is \>long command ” This is long command注意:“>”符号是自动产生的,而不是输入的。
12-2 编写/修改权限及执行Shell 程序的步骤◆ 编写Shell 程序◆ 执行Shell 程序Shell 程序有很多类似C 语言和其他程序设计语言的特征,但是又没有程序语言那样复杂。
Shell 程序是指放在一个文件中的一系列Linux 命令和实用程序。
在执行的时候,通过Linux 操作系统一个接一个地解释和执行每条命令。
首先,来编写第一个Shell 程序,从中学习Shell 程序的编写、修改权限、执行过程。
12-2-1 编辑Shell程序编辑一个内容如下的源程序,保存文件名为date,可将其存放在目录/bin下。
[root@localhost bin]#vi date#! /bin/shecho “Mr.$USER,Today is:”echo &date “+%B%d%A”echo “Wish you a lucky day !”注意:#! /bin/sh通知采用Bash解释。
【例子】C语言获得Shell返回值并进行匹配操作

【例子】C语言获得Shell返回值并进行匹配操作在linux下使用ifconfigl命令能很方便的查看网卡与网线是否连通,运行ifconfig eth0命令大致输出如下:# ifconfig eth0eth0 Link encap:Ethernet HWaddr 00:25:35:68:CC:D6inetaddr:192.168.1.168 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::215:c5ff:fe18:ccd6/64 Scope:LinkUP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:130722 errors:0 dropped:0 overruns:0 frame:0TX packets:112560 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:1000RX bytes:104371099 (99.5 MiB) TX bytes:20518584 (19.5 MiB) Interrupt:16其中的RUNNING就表示网卡与网线正常链接,拔掉网线再运行此命令就会发现RUNNING不在了。
目的是用C语言来实现程序,而linux系统提供了popen/pclose进程管道让C和shell很方便的交互,不过使用的时候要注意设置权限,以免造成安全隐患。
废话不多说,看下面C代码结合shell命令检测网卡与网线连通状况:netstat.c#include#include#include#include/************************************************************** ********* 函数名称: GetNetStat* 功能描述:检测网络链接是否断开* 输入参数:* 输出参数:无* 返回值:正常链接1,断开返回-1* 其它说明:本程序需要超级用户权限才能成功调用ifconfig命令* 修改日期版本号修改人修改内容* ---------------------------------------------------------------------* 2010/04/02 V1.0 eden_mgqw*************************************************************** ********/int GetNetStat( ){char buffer[BUFSIZ];FILE *read_fp;int chars_read;int ret;memset( buffer, 0, BUFSIZ );read_fp = popen("ifconfig eth0 | grep RUNNING", "r");if ( read_fp != NULL ){chars_read = fread(buffer, sizeof(char), BUFSIZ-1, read_fp);if (chars_read > 0){ret = 1;}else{ret = -1;}pclose(read_fp);}else{ret = -1;}return ret;}int main(){int i=0;i = GetNetStat();printf( "nNetStat = %dn", i );return 0;}下面是编译运行程序的输出结果(正常返回1,断开返回-1):# cc netstat.c# ./a.outNetStat = 1。
第六章 dc_shell综合脚本

第六章dc_shell命令解释程序第一节设计目标6-1-1背景介绍dc_shell 是Synopsys Design Compiler的shell(命令解释程序),与unix的shell 类似。
Unix的C shell 和Bourne-shell作为命令解释程序,在用户和unix 核之间实现了功能极强的接口程序。
相同地,Dc_shell最为Synopsys Design Compiler的功能极强的命令解释程序。
象unix shell 提供程序设计语言在unix 文件系统中操作一样,dc_shell 提供script(脚本)语言在Design Compiler 的设计中操作,且仿造unix shell 的相同的结构。
用dc_shell 脚本综合设计有许多优点:首先,脚本执行速度比象design analyzer 交互式的界面快得多,脚本也用来证明综合设计的过程。
更重要的是,脚本提供一个重复编译的机制,这不仅对设计的再利用重要,而且对于当要求一项函数改变时,再次产生设计文件的所要求的时间最小化也很重要。
所有的这些优点源于使用脚本自动走完综合流程。
但是,dc_shell 脚本能够做的远不只这些,它能扩展Design Analyzer和Design Compiler的功能。
一些Design compiler命令的顺序由脚本得出。
大多数经验丰富的Synopsys的用户将脚本和Design analyzer结合使用来分析和优化设计。
6-1-2 目标程序类型的审阅dc_shell脚本生成设计目标程序和编译属性来引导综合流程。
当编写dc_shell脚本时,考虑正在运行的目标程序/信息的类型是很重要的。
这一节从“Design Compiler Family Reference Manual”的章节中总结了“design compiler”的概念。
6-1-2-1 实例、网络、端口原理图由三个基础的构件组成:实例、网点、端口。
C下执行命令行的方法

一、system()--执行shell命令1、包含头文件:#include <stdlib.h>2、定义int system(const char * string);3、参数String:合法的可执行DOS(SHELL)命令4、返回值1)如果system()在调用/bin/sh 时失败则返回127, 其他失败原因返回-1。
2)若参数string 为空指针(NULL), 则返回非零值。
3)如果system()调用成功则最后会返回执行shell 命令后的返回值, 但是此返回值也有可能为system()调用/bin/sh 失败所返回的127, 因此最好能再检查errno 来确认执行成功。
5、说明system()会调用fork()产生子进程, 由子进程来调用/bin/sh-c string 来执行参数string 字符串所代表的命令, 此命令执行完后随即返回原调用的进程. 在调用system()期间SIGCHLD 信号会被暂时搁置,SIGINT 和SIGQUIT 信号则会被忽略。
6、用例system(“ipconfig/all”);7、重定向标准输出流FILE *stream;stream = freopen(“data.txt”,”wb”,stdout);运行结果可以重定向到data.txt8、隐藏控制台窗口#pragma comment( linker, “/subsystem:\”windows\”/entry:\”mainCRTStartup\”” )仍有调用的DOS窗口一闪,且重定向失效。
二、WinExec()—运行可执行程序1、包含头文件#include<windows.h>2、定义UINT Win Exec(LPCSTR lpCmdLine, UINT uCmdShow);3、参数lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程序的命令行(文件名加上可选参数)。
Shell编程实验指导

Shell编程实验一、实验目的了解 Shell 的作用和主要分类。
了解 Bash的一般语法规则。
练习编写简单的shell程序。
二、实验内容1.Shell变量的定义及其使用。
2.位置参数和环境变量。
3.Shell中的特殊字符。
4.条件判断结构与循环结构5.函数的定义和使用三、预备知识1、LINUX环境下常用命令和VI编辑器的操作。
2、了解Shell作用和主要分类等基础知识。
四、实验设备及工具软件:PC机操作系统REDHAT ELAS4环境五、实验原理及说明Shell是Linux系统中一个重要的层次,它是用户与系统交互作用的界面。
在介绍Linux命令时,Shell都作为命令解释程序出现:它接收用户打入的命令,进行分析,创建子进程实现命令所规定的功能,等子进程终止工作后,发出提示符。
这是Shell最常见的使用方式。
Shell 除了作为命令解释程序以外,还是一种高级程序设计语言,它有变量,关键字,有各种控制语句,如if, case, while, for 等语句,有自己的语法结构。
利用Shell程序设计语言可以编写出功能很强、但代码简单的程序,特别是它把相关的Linux命令有机地组合在一起,可大大提高编程的效率,充分利用Linux系统的开放性能,设计出适合自己要求的命令。
六、实验步骤1.语法练习(1)Shell变量Shell有两种变量:环境变量和临时变量。
在Shell脚本中临时变量又分为两类:用户定义的变量和位置参数。
用户定义的变量用户定义的变量是最普遍的Shell变量,变量名是以字母或下化线打头的字母、数字和下线符序列,并且大小写字母意义不同。
变量名的长度不受限制。
定义变量并赋值的一般形式是:变量名=字符串例如,MYFILE=/usr/meng/ff/m1.ca.定义并显示变量的值在程序中使用变量的值时,要在变量名前面加上一个符号“$”。
这个符号告诉Shell,要读取该变量的值。
作为交互式输入手段,可以利用read命令由标准输入(即键盘)上读取数据,然后赋给指定的变量。
CShell简介

CShell简介摘要:本⽂简单的总结了Cshell的基本操作和基础知识。
本⽂摘录于互联⽹,阅读本⽂需要有⼀定的Unix操作基础。
当你执⾏⼀个shell script时, 系统会检查script⽂件的第⼀⾏以确定如何执⾏其中的命令:○如果第⼀⾏以#!开始, 后⾯跟着⼀个程序名, 系统就会⽤那个程序来执⾏script中后⾯的命令.○如果第⼀⾏以#开始, 系统会⽤Cshell执⾏script.等同于#!/bin/csh○如果第⼀⾏不是以#开始, 系统就会⽤Bshell来执⾏script.等同于#!/bin/sh[建议您使⽤明确的写法,即⽤#!/bin/csh(sh)]如果你想快速执⾏Cshell, 即不想读⼊Cshell的启动程序(.cshrc等), 在script⽂件的第⼀⾏应该⽤类似下⾯的格式:#!/bin/csh -f scriptSCRIPT中的参数及变量如何将命令⾏的参数传给script呢? 可以这样: 键⼊script名, 后⾯跟任何你想要传递的参数. Cshell把script名后⾯的字符按照词(words)来划分后传递给⼀个叫做argv的变量数组, 叫做arguments list. 这样命令⾏的参数就作为words存储于argv中, 连同script名, 分别可以被引⽤为argv[0], argv[1], ... argv[n], 或者你也可以⽤等效的⽅法即$0,$1,...,$n来引⽤它们,其中n是参数的个数.除了argv, $0, $1, ... $n, 等以外, 你还可以在script中使⽤其他变量.有许多符号可以对变量进⾏操作: 读取, 赋值, 判断属性等等. 分述如下:o$?name判断变量是否存在, 若存在(被set过)则等于 1 . 否则等于 0 .例如:% set var='abc'% echo $?var #结果为 1% unset var% echo $?var #结果为 0o$#name计算变量name中的词(words)数.例如:% set var=(a b c) # $#var == 3% set var='abc' # $#var == 1% unset var # var: Undefined variable.o$$$$是Cshell的特殊变量, ⽤于表⽰执⾏此script时的进程号. 因为进程号是唯⼀的, 你可以⽤$$来⽣成⼀个唯⼀的临时⽂件,⽐如tmp.$$. 它可以避免任何⽂件名的冲突. 当然你也可以开发你⾃⼰对$$的独特应⽤.o$<重定向符号. 即从终端读⼊(⼀⾏). ⽐如:echo -n "yes or no?"set a=($<)即变量a从终端输⼊. (如果你输⼊了⼀个空⾏或^D, $#a将等于 0 )(此外,还可以通过``来获取⼀些命令⾏程序的输出,如set ab=`pwd`)$n和$argv[n]实际上有个微⼩的差别: 当n⼤于参数个数($#argv)时, $argv[n]要报错,⽽$n永远也不会有这种"下标溢出"的错.对其他变量, 也不会发⽣"下标溢出"的错误, 例如:当(n > $#var) 时, $var[n-]不给任何结果和错误信息.⽽$var[m-n]给出$var[m]到$var[$#var]的words.如果(m > $#var) 则没有任何结果.⽂件操作格式:-操作符 filename-e ⽂件存在返回1(.true.), 否则返回0(.false.).-r ⽂件可读返回1,否则返回0.-w ....可写................-x ....可执⾏...............-o ⽂件属于⽤户本⼈返回1, 否则返回0.-z ⽂件长度为0返回1, 否则返回0.-f ⽂件为普通(plain)⽂件返回1, 否则返回0.-d ⽂件为⽬录⽂件时返回1, 否则返回0.路径名操作:你可以对路径名进⾏操作, 以便于去掉你不需要的部分.:t (tail)只保留路径名最右边的部分, ⽽将前⾯的全部去掉. (相当于basename):r (root)去掉从"."(dot)开始的后缀部分.:e (end)去掉从左边开始⼀直的"."的前缀部分.:h (head)去掉最后的⼀部分, 只保留⽂件所在的⽬录名.⽐如, 你有⼀个叫做 /usr/people/user1/file1.txt的⽂件,在script中将它赋值给变量var_file, 则:$var_file:t == file1.txt$var_file:r == /usr/people/user1/file1$var_file:e == txt$var_file:h == /usr/people/user1返回代码:严谨的程序应该测试返回代码以判断该程序是正常结束还是别的情况.尤其在你写前后相关的script的时候, 后⾯的命令要⽤到前⾯命令的执⾏结果的时候.⼀个命令执⾏后的返回代码存放在叫做status的变量中, 当命令执⾏成功正常退出时status为0, 否则为1.⽐如你想检查前⾯⼀个命令是否正常地被执⾏了, 从⽽判断下⼀个命令是否应该执⾏,就可以:command1set checkpoint=$status[commands...]if(! $checkpoint) thencommand2elsecommand3endif控制结构:Cshell中基本的控制结构包括 foreach, if结构, 另外还有switch及while,当然还有那个从程序设计概念提出来开始就⼀直存在的幽灵: goto.1. 控制循环的foreach语法为:foreach variable (variable_value lists){commands}end变量variable依次取lists中的值, 执⾏command(s)命令. lists中给出多少个值, 就进⾏多少次操作. 结束循环后变量variable的取值为lists中的最后⼀项.○ foreach-end中间可以⽤ break 以及 continue 控制循环的中断及继续: break终⽌循环, continue 终⽌⼀轮循环操作并开始下⼀轮循环.○ noglob变量的设置可以防⽌lists中的值作⽂件名扩展. 在script的前⾯set即可.set noglob⽐如你的lists是 (a b c*), set noglob的结果是直接解释成a, b, c*; ⽽没有设置noglob时则解释成a, b, 以c开始的⽂件名. 如果你的⽬录下没有这样的⽂件时, 就会报错(No match). 当然你应该在script的结束时unset noglob, 以不影响后⾯的操作.2. 条件控制 if○语法为:if ( expression ) then[commands]else[commands]endif○另外还可以⽤else if:if ( expression ) then[commands]else if ( expression ) then[commands]else[commands]endif○还可以⽤简化格式:if ( expression ) commandif ( expression ) \command# "\"(backslash)后⾯只能接newline(回车即可), 不能有任何其他字符; # 单个命令command不能包括"|", "&" 以及";". 也不能使⽤其它控制语句.○不能使⽤下⾯的格式:if ( expression )then或者if ( expression ) then command endif3. 循环控制 while语法为:while ( expression )[commands]end# while中也可以使⽤break以终⽌循环.例程(本例执⾏10次循环):#!/bin/cshset ai=1while ( $ai <= 10 )echo the ${ai}th time running.@ ai++end4. 开关控制 switch语法为:switch ( $word )case str_1:[commands]breaksw...case str_n:[commands]breakswdefault:[commands]breaksw# word为控制变量, breaksw 跳出 switch 操作.5. goto语法为:goto label例如(此例为⽆限循环!):loop:[commands]goto loop其它:1. 中断处理如果你的script还没有运⾏结束, ⼜不想继续运⾏, 你可能要按下^C以终⽌执⾏它,⼜或者你的script设计成那种⽆限循环式的, 即允许使⽤者重复执⾏直到按下^C(⽐如查询程序). 按下^C后, 系统会终⽌整个script, 但是如果你不想这样做(⽐如你还想删除中间的某些临时⽂件), 就可以在script中设定中断处理:onintr labellabel是标识⾏, 其结果是你按了^C后, goto到label⾏继续执⾏.2. exit前⾯讲过命令有返回代码, 同样script也可以有返回代码. ⽤exit可以终⽌script的执⾏并返回⼀个值:exit ( status )status 即是你要返回的值.3. expression(表达式)if和while都要⽤到expression, expression可以是变量值以及他们的操作结果, 或者是任何返回数值的操作. ⽐如 ( $var ), ( -e filename )等等.C 中的所有代数及逻辑运算符都可以⽤于Cshell的expression中. ⽐如 == 和 !=⽐较两个字符是否相同, && 和 || 表⽰逻辑 "与" 和 "或", "!" 表⽰"⾮".代数运算使⽤expr, 如 expr $a + $b。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京联合大学《操作系统课程设计》实验一:命令行解释程序学院:信息学院专业:计算机科学与技术课程:操作系统班级: 1 1 0 3 B 姓名:傅笔贵学号: 20090803053022014年7 月10 日一.采用的数据结构说明字符数组:本程序中包含的字符数组有:filename1[20]:在Ccopy()函数中,存储源文件路径和名字的字符数组。
filename2[20]:在Ccopy()函数中,存储目标文件路径和名字的字符数组。
oldname[20]:在Cmv()函数中用来保存源文件路径和名字的字符数组。
newname[20]:在Cmv()函数中用来保存目标文件路径和名字的字符数组。
Cho2[6]:存取用户输入的指令,并用来作为Switch分支的判定条件之一。
File[20]:Cerase()函数中用来存放要删除的文件的路径和名字的字符数组。
Word[100]:在Cdis()中存放用户要回显的字符串。
二.源程序清单、注释和流程图(1)流程图(2)源程序和注释#include<stdio.h>#include<sys/types.h>#include<windows.h>#include<process.h>#include<string.h>#include<conio.h>#include<stdlib.h>int flag=1;char ch[8];//存储文件读取内容的中间变量FILE *fp;FILE *fp1;char filename1[20];/*复制文件候存放的原文件名*/char filename2[20];/*复制文件候存放的目标文件名*/char oldname[20];/*用来存放移动文件的源文件名*/char newname[20];/*用来存放移动文件的目标文件名*/void start_copy(char *filename1,char *filename2)/*文件复制函数,可以实现文本和图片的复制*/{if((fp=fopen(filename1,"rb"))==NULL||(fp1=fopen(filename2,"wb"))==NUL L)/*源文件或目标文件打开失败则无法进行复制*/{printf("can't open the source file!\n");exit(0);}else{fread(ch,1,8,fp);//一次读取八个字节的字节流,存放到ch字符数组里while (!feof(fp))//没读取到文件尾部时,持续读取{fwrite(ch,1,8,fp1);//写到目标文件里fread(ch,1,8,fp);//继续读取}fclose(fp);//关闭指针,释放内存fclose(fp1);}}void Cend(){flag=0;//将循环条件flag=1变为0来结束循环,结束程序}void Cdir(){/*目录显示函数,除了调用Cmd没有更好的解决办法,是本程序的遗憾.*/system("cmd.exe /b dir");}void Ccopy()//文件复制主函数{scanf("%s%s",&filename1,&filename2);//获取源文件和目标文件名start_copy(filename1,filename2);//传参到复制函数}void Cerase()//删除文件函数{char File[20];//文件名存储scanf("%s",&File);//获得文件名if(remove(File)==0)//删除成功remove返回0{printf("Remove %s Successfully!\n",File);}else{perror("Failed!");}}void Cdis(){char Word[100];//存放用户输入的字符串getchar();//吸取第一个不必要的空格字符gets(Word);//获得用户的字符串内容printf("---------E---C---H---O-------------\n");puts(Word);//显示用户的字符串内容}void Cmv()//移动或重命名文件函数{scanf("%s%s",&oldname,&newname);//用来获取用户输入的两个文件名rename(oldname,newname);}int main(){//定义判定字符char cdir1[]="Cdir";char cdir2[]="cdir";char ccopy1[]="Ccopy";char ccopy2[]="ccopy";char cerase1[]="Cerase";char cerase2[]="cerase";char cdis1[]="Cdis";char cdis2[]="cdis";char cend1[]="Cend";char cend2[]="cend";char clr1[]="Cclr";char clr2[]="cclr";char cmv1[]="Cmv";char cmv2[]="cmv";char cuname1[]="Cuname";char cuname2[]="cuname";while(flag){char Cho[100]={0};char Cho2[6];int num=0;/*主菜单*/printf("-----------------------------------\n");printf("---------M E N U----------\n");printf("-----------------------------------\n");printf("Cdir . Show the Detail of Dir and files.\n");printf("Ccopy . Copy the file.\n");printf("Cerase . Erase(Delete) the file.\n");printf("Cdis . The Echo of your input words\n");printf("Cclr . Clear the Screen.\n");printf("Cmv . Move Or Rename the file.\n");printf("Cuname . Show CPU Info.\n");printf("Cend . Quit.\n");printf("\n");printf("\n");printf("Please Enter The Command:");scanf("%s",&Cho2);/*下面这一段将对用户输入的字符串第一个空格前的内容进行判定,确定功能号,在转入对应的Case分支决定用户本次所使用的功能.*/if(strcmp(Cho2,cdir1)==0||strcmp(Cho2,cdir2)==0)//首字母大小写均可识别{num=1;}else if(strcmp(Cho2,ccopy1)==0||strcmp(Cho2,ccopy2)==0){num=2;}else if(strcmp(Cho2,cerase1)==0||strcmp(Cho2,cerase2)==0){num=3;}else if(strcmp(Cho2,cdis1)==0||strcmp(Cho2,cdis2)==0){num=4;}else if(strcmp(Cho2,cend1)==0||strcmp(Cho2,cend2)==0){num=5;}else if(strcmp(Cho2,clr1)==0||strcmp(Cho2,clr2)==0){num=6;}else if(strcmp(Cho2,cmv1)==0||strcmp(Cho2,cmv2)==0){num=7;}else if(strcmp(Cho2,cuname1)==0||strcmp(Cho2,cuname2)==0){num=8;}else{printf("ERROR COMMAND,TRY AGAIN!\n");}switch(num){case(1):Cdir();break;//功能1,启动Cmd调用dir \b检查目录case(2):Ccopy();getchar();break;//功能2,复制一个文件到另一个目录case(3):Cerase();break;//功能3,删除一个指定路径的文件case(4):Cdis();break;//功能4,回显用户输入的字符串内容case(5):Cend();break;//功能5,结束程序case(6):system("cls");break;//功能6,清屏case(7):Cmv();break;//功能7,移动一个文件,如果路径不变只改变名字,则变为重命名功能case(8):system("systemInfo");break;//功能8,显示计算机详细信息}}}三.Windows命令与Linux命令的不同本程序的功能有8个,其中Cdir和Linux下的ls基本区别不大,但是ls 后面有很多参数,这是和Windows在cmd下调用dir不太一样的地方。
Ccopy和Linux下的Cp命令没有什么区别。
Cerase和Linux的rm是有区别的,Linux删除的文件是无法补救的,因此在删除之前会有提示是否要真的删除,rm –r可以连同文件的子目录都删除,这点和windows下的rmdir类似。