文档库 最新最全的文档下载
当前位置:文档库 › shell编程与文本编辑(vi)剖析

shell编程与文本编辑(vi)剖析

shell编程与文本编辑(vi)剖析
shell编程与文本编辑(vi)剖析

shell编程与文本编辑

8.1 shell编程

8.1.1 shell基础

shell是用C语言写的一个程序,它虽然与系统在一起并且作为系统的一部分提供给用户,但它不是操作系统的核心部分,它属于普通用户程序, 是命令的解释程序。

8.1.1.1 shell命令及其表示方式

在shell程序中,一个命令行是由一系列的参量(argument)组成,参量与参数之间用空格或制表符隔开。第一个参量(位置计数为0)即是命令的名字。

命令行的一般格式为:参数0 参数1 参数2 ……

例如:cat file1 file2 file3

在这个命令行中共有四个参量,第一个参数cat是命令的名字,其余三个是文件名,其意思是打开文件file1、file2和file3。

如果命令行的第一个参量(即命令名的位置)是一个文件,而这个文件是可执行的,那么这个可执行的文件:

A.可能是一个已经被编译过的程序,在这种情况下,直接运行这个程序即可

B.如果文件被标记为可执行的,但它不是被编译这的程序,那么就认为它是一

个shell过程。也就是说,它是一个包括了一些shell命令行的普通文本文

件。遇到这种情况,shell读这个文件,并且执行包含在文件中的一些shell

命令。

8.1.1.2 shell程序所用的命令路径

通常,shell从文件系统的三个不同的地方查找所用的命令,查找的顺序为:当前目录、目录/bin、目录/usr/bin。这样的机制,给多个用户执行的公共命令提供发一种方便的方法。

8.1.1.3 文件名匹配符

shell程序使用了三种匹配符:

(1)* 星号:匹配任何字符串,包括空字符,但不含符号“.”

例如:/u/data/*表示目录/u/data下所有的文件

/u/data/*ab表示目录/u/data下所有以ab字母结尾的文件

/u/data/*.c表示目录/u/data下所有以.c结尾的文件

(2)?问号:匹配一个任何字符或数值, 但不含符号“.”

例如:/u/data/?表示目录/u/data下只含一个字母的文件

/u/data/f?b表示目录/u/data下以f字母开头、以b字母结尾而且只含

三个字符的文件

(3)[…] :在方括号中,可以是任何字符或数值序列。

A.它可以匹配方括号中所包含的任何一个字符。

例如:[abdf]等于或a、或b、或d、或f

B。在方括号里面,由小横杠隔开的一对字符或数值,可以与这对字符或数值给

出的范围中任意字符或数值匹配。

例如:[a-d]等于abcd

[1-6]等于123456

C.在方括号里面,字符“!”表示不包含。

例如:[!A-Z]等于不含从A至Z的大写字母

注意:目录名字中不应包含下列字符中的任何一个:* ?与[ ],如果在目录中使用了这些字符,那么在按照指定字符串查找与之相匹配的名字时,可能出现无限循环。

8.1.1.4使用引号

对shell来说,引号的作用是删除特殊字符的特殊含义。Shell程序中的特殊字符有:<> * ? [ ] # $

要使这些字符失去在shell中的特殊意义,需要某些形式的引用。

引用方式有三种:

(1)单引号“′”把特殊字符括起来。

在单引号中引用的全部字符,都将失去它的特殊意义。

例1:在键盘上输入下列信息:

aaa=testing

echo `Parameter \$aaa is $aaa`

将显示结果为:Parameter $aaa is $aaa

例2:在键盘上输入下列信息

aaa=testing

echo `Parameter \$aaa is` $aaa

将显示结果为:Parameter $aaa is testing

结果表明:单引号中引用的字符$,已经失去了它的特殊意义

(2)使用双引号““”把特殊字符括起来。

在双引号中引用的全部字符,除特殊意义的字符$、$(command)、\、`、”外,其它字符都将失去它的特殊意义。

例3:在键盘上输入下列信息

aaa=testing

echo “Parameter \$aaa is $aaa”

将显示结果为:Parameter $aaa is testing

结果表明:双引号中引用的字符$,保留它的特殊意义

(3)特殊字符前使用反斜杠“\”,它的作用是删除特殊字符的特殊含义,将它变成普

通字符。

例4:在键盘上输入下列信息

aaa=testing

echo `Parameter \$aaa is` $aaa

将显示结果为:

Parameter $aaa is testing

单引号内的符号$失去了它的特殊意义。

8.1.1.5标准输入输出

对于绝大多数的shell命令来说,从终端上输入还是从文件中输入,输出到终端还是输出到文件中,都无关紧要,命令的功能不变。因此,shell命令既可以在终端上使用,也可以在管道中使用。只有极少数的几个命令与它们的输入输出方式有关(即输入输出方式不同,它们的作用也不同)。

在执行一个命令的时候,通常需打开三个文件:标准输入(standard input)、标准输出(standard output)、诊断输出(diagnostic output)。诊断输出也称标准出错输出(standard),它存放着命令执行过程中出现的出错信息。每个文件都有一个相应的数字,称为文件的描述符。按照约定:

文件文件描述符

标准输入0

标准输出 1

诊断输出 2

通常,三个文件的初始状态都与终端相连(0号描述符是键盘,1号和2号描述符是终端屏幕),在shell中,这三个文件都可以脱离初始状态,进行重新定向。1。输入重新定向符

符号< 表示输入重新定向符。通过符号< 可将命令所需要的信息从标准输入设备定向到某一个文件。

例如:mail 命令所需的信息来自于键盘,现将它定向到文件file

# mail 用户名< file

2.输出重新定向符

符号> 与>>表示输出重新定向符。在标准输出的情况下,如果原来的文件有内容,使用重新定向输出符> 后,原有内容被新的内容所替代;若使用重新定向输出符>> ,则新的内容将追加到原有内容的后面。

例如:敲入命令行:

# date > file

表示把命令date的结果输出重新定向到文件file,并将文件file内原来的内容冲掉。

上面的两种定向输出,都是假定原有文件已经存在的情况。如果定向符后面是一个新的文件名,那么Shell将建立这个文件。

例如:>abc表示建立一个长度为零,名字为abc的文件

3.错误重新定向符

符号2> 与2>>表示错误输出重新定向符。执行unix系统命令时所产生的诊断输出,通常被定向到文件描述符2。

例如:cc test.c 2>>err

在这个命令行中,cc是C语言的编译命令,test.c是C语言编写的源程序。2是标准错误输出的文件描述符。用cc命令对test.c进行编译过程中出现的错误信息,通常放在标准错误输出文件中。这个命令行,把标准错误输出文件重新定向到文件err。其结果是把错误信息附加(appends)到了err文件的尾部,在使用重新定向符时

应特别注意,文件描述符与重新定向符之间不能有空格或制表符,比如命令行:2>> 中的数字2与符号>>之间不留空格。如果两个符号之间出现了空格或制表符,文件描述符就有可能被shell视为命令的一个参量。

8.1.1.6命令行和管道线

在unix系统中,可以若干命令连用,而每个命令之间由竖线“|”(称为管道符)隔开。对于这样使用的命令序列,我们称它为管道线(pipeline)。在管道线中,一个命令的输出(命令产生的结果),正是下一个命令的输入。当然位于管道行的最后一个命令例外。

“过滤器”是在使用管道线时经常遇到的一个概念。所谓“过滤器”是指管道线中的一个命令,过滤器首先读进输入,接着以某种方式将“输入”进行变换(相当于过滤),再将变换结果输出。一个管道线通常由一系列过滤器组成。

Unix系统的过滤器有:cut tr tee pr

有关上述命令的使用,请参阅相关文档资料。

例如:

1.who | wc -1 显示系统中注册的用户数。

2.who | grep bb 显示在系统中注册,且用户名中包含字符串“bb”的用户。

3.who | grep bb |sort |pr

此行使用了三个管道符。首先查出在系统中注册的用户清单;再从名单中找出名字中含有字符串“bb”的用户名;然后,把这些用户名按第一个字母顺序排列;最后,以页为单位把排列好的用户清单显示出来。由此,可以看出“过滤器”在管道中的作用。

4.{ date;who|wc -1;}>>log

这一行由三个命令组合使用。把当前日期、在系统注册的用户数附加到log文件的尾部。使用大括号时应当注意,在{的后面一定要有一个空格,而在}的前面要有一个分号“;”。

8.1.1.7命令替换

在shell中,可以把命令行中的命令由后引号(`…`)括起来。对于一个由多参量组成的命令行,shell首先执行后引号中的命令,并且用这个命令的输出(执行这个命令产生的结果),来取代整个表达(即后引号及所包含的命令),这种在一个由若干命令组成的命令行中,由命令输出结果取代这个命令本身的表达方式,称为命令转换。

例1:today=`date`后引号中的date命令的功能是,读出当前系统的时间和日期。然后,把执行date命令的结果赋给变量today。

进行命令转换时,后引号中可以是一个命令,也可以是多个命令的组合,比如管道线等。

例2:users=`who | wc –l`表示将当前系统中注册低用户数,赋给了shell变量users

例3:用户wang敲入命令行:

$ logmsg=`echo your login directory is \`pwd\``

$ echo $logmsg

回车后屏幕显示:your login directory is /usr/wang

8.1.2 shell中的变量

在shell中,变量是一个字符串值的名字。shell提供了定义变量的机制。某些变量被作为位置参数用在命令行中;而另一些shell变量可由用户或shell给以赋值。

8.1.2.1位置参数

位置参数是shell变量的一种。当一个shell过程被调用时,shell将隐含地建立位置参数。在命令行上,位置0处是shell过程的命令名,其位置参数为$1、$2 (9)

Shell中规定,在调用一个shell时,它的参数最多不能超过9个。如果参数多于9个,需要用shift命令进行读写操作。

8.1.2.2用户定义的变量

在shell中,用户可以自己定义变量。变量名字可以字母组成,也可以由字母和数字混合组成。如果是后者,一定要以字母开头。

赋值语句的格式为:变量名=字符串

其中:变量名是用户自己定义的变量名字

字符串作为一个值,赋给“变量名”所表示的变量。

注意:

1.在shell赋值语句中,等号的左右两侧都没有空格。

2.位置参数不能出现在赋值语句的左侧。

3.在一个赋值语句中可以有多个赋值,其赋值的顺序是从右到左。

例如:MAIL=/usr/mail/wang

var =“echo $1 $2 $3 $4”

stars = * * * * *

asterisks = `$ stars`

ABC=$stars

第一行,把一个文件的路径赋给变量MAIL。

第二行,双引号把字符串括起来,允许右侧空格、制表符或分号。var的值是由字符串“echo”和四个位置参数组成的字符串。

第三行,把字符串“* * * * *”赋给变量stars。

第四行,变量asterisks的值是“$ stars”,而不是“* * * * *”。

第五行,变量ABC的值是“* * * * *”。

8.1.2.3 shell定义的变量(环境变量)

shell中的变量有两类:一类是由用户设置的变量,它们被称为shell变量。上一节的例子即是用户自己定义的shell变量,变量的名字可以任意确定,它的值也是根据需要设置的;另一类是由shell本身设置的变量,称之为环境变量。它的名字是固定的,它们的值不是随意设置的。

比较可以看出,shell变量是在一个shell活动(如,shell程序运行)内部临时创建的变量,它被用来暂保存信息,当本次shell活动终止时,它就被丢弃了。Shell 变量只在shell程序内有效,对其它程序来说是不可见的。所谓环境是对程序的运行而言的,在系统上运行的每一个程序,当它们投入运行时,在内存中都分配有一个专门的区域,这人区域被称为环境。在一个程序运行时,它将继承其父进程(即调用本程序的那个程序,或者是本程序的主程序)的环境副本。这时就要作用环境变量,把配置信息传递给子进程。

例如:HOME 表示用户注册主目录名

PATH 表示shell寻找命令的路径

PSI 用来作为屏幕提示的主字符串。

8.1.2.4 预先定义的特殊变量

在shell中,下面几个变量具有特殊意义。它们的设置,只能由shell进行,

而不能通过用户进行重新设置。

$#记录传送给shell的参量数,但它不把shell过程自己的名字计数在内。因此,$#可以给出所设置的位置参数的个数。

$?包含最后一个执行命令的返回结果。它是一个十进制数字。为零时,表示命令执行成功。

$$这个变量表示当前进程的进程号。因为对系统中现有的进程来说,进程号是唯一的。这个字符串常常被用来为临时文件产生唯一的文件名。

8.1.2.5 shell说明

1.改变目录

cd命令的功能,是把当前目录改变为这个命令变量中指定的那个目录。系统

提供的这种手段,可以直接应用到shell程序中来。

2. .profile文件

在用户每次向系统注册时,shell都要读该用户的.profile文件。系统中的每个普通用户都有自己.profile文件。超级用户在根下有一个.profile文件,通过它设置shell程序所需的环境变量。

3.运行标志

在shell中,通过set命令设置某些标志,可以使用户改变shell的功能。

其中标志项有:

-a 标志变量,为export命令的使用,修改或建立标记。

-e 如果shell是非交互式的,当一个命令以非零状态返回时将直接退出shell。

-f 禁止文件名产生。

-h 设置函数命令(即把函数当作命令使用)。

-k 把全部的关键字参量放在命令的环境中。

-n 读命令,但不执行这个命令。

-x:命令执行时,这些命令和它们的参量同时显示在屏幕上。但也有些shell命令,比如用于循环体的“for”、“while”等并不显示。

-v:读输入信息时,输入行在屏幕上显示。对分析输入行的语法错误是非常有用的。

例如:# set -x

# echo this is a test

回车后,屏幕显示:

+echo this is a test

this is a test

第一行:echo命令和它的参量全部显示,行首的+号,提示用户检查是否有语句错误。

第二行echo命令执行的结果。

注意:在上述标志前使用加号“+”,表示关闭这个标志;使用减号“-”,表示设置这个

标志。

8.1.3 运行环境和流向控制

8.1.3.1命令运行的环境变量

在shell中,所有的变量及它们的值,都可以认为是命令开始执行时建立起来的运行环境。此外,运行环境还包括这样一些变量,它们中一些是从父进程沿袭下来的变量,另一些是使用命令时,命令行上指定作为关键字参数的变量。

如果shell进程要给它的子进程传送变量,那么这个变量就必须使用export命令进行说明。export命令也叫变量输出命令。

赋值形式为:变量=值

例如:TERM=vt100;export TERM

8.1.3.2 shell过程调用和参量传递

1. shell调用

shell实际上是一种命令。我们可以按照unix系统提供命令的使用方法来使用它。因此,调用shell有两种方法:

(1)sh proc [arg]

它的含义是:请示系统调用一个新的shell来读proc,方括号中的arg是proc运行所需的选项。

例如: 一个名字叫echo2的shell过程,其文本内容为:

for word

do

echo $word$word

done

在提示符下敲入命令行:#sh echo2 abc

屏幕上将显示信息:abcabc

或sh -v proc [arg]

其中,-v是执行标志,相当于在过程proc的开始处放了一个命令行:set -v 例如上例给出的shell,在提示下符下敲入命令行:#sh -v echo2 abc

回车,屏幕显示:

for word

do

echo $word$word

done

abcabc

因此,使用了标志项-v后,它把shell过程的文本及执行这个过程所产生的结果全部显示在屏幕上。同样,还可以设置其它标志项:-x、-e、-u与-n。

(2)proc [arg]

如果proc是一个可执行文件,并且是一个不需编译就可执行的程序,这时,调用shell的方法可以为:proc args

2.参量传给shell的过程

当一个命令行从键盘上敲入后,shell就对这个命令行进行扫描,并把形如$n 的字符序列由第n个参量取代。Shell过程的名字计数为$0。这样的计数方法,就可

以直接索引过程的名字,并且可以有9个位置参数。多于9个位置参数的情况,可以用shift命令来处理。

shift命令如果不带任何参量,它的功能是把位置参量左移一位,即$1的值被移出,$2的值取代$1的值,$3的值取代$2的值,……依次类推。由此可见,左移后,原来$1的值丢掉了,它不能移到$0的位置。如果这个命令带有参量:shift n ,此处n是一个数字,那么shift所完成的功能是:

每次把位置参数左移n位。

例如: #file

while test $# !=0

do

echo $*

shift

done

其中

第一行: 含有字符“#”,表示注释行。

第二行: 循环命令while用于检查判断,当参数的个数$# 不为0时,继续执行循环体中的命令。

如果使用下面命令调用程序file:file a b c d e

将会显示结果:

a b c d e

b c d e

c d e

d e

e

结果表明,循环体被执行了5次。从第二次开始,每执行一次,就把$1位置上的参量左移一位。

8.1.3.3 shell流向控制

所谓流向控制,是指shell过程中的循环、检测、设陷、退出等涉及到shell过程运行走向的一系列操作。

相关的几个问题

(1) 管道线

管道线是一个包含了一个或多个命令的序列。命令之间由管道符“|”隔开。在一个管道线中,前一个命令的标准输出都是与之相连的后一个命令的标准输入。管道线中的每个命令是独立运行的,shell一直等到最后一个命令执行完成。整个管道线的退出状态(即管道行完成时返回的状态),是管道行中最后一个进程的退出状态。(2) 命令清单

命令清单是由一个或多个管道线构成的序列。管道线之间可以是符号“;”、“&”、“&&”、“||”。命令清单可以由“;”或“&”来结束。命令清单中如果两个管道线之间是用分号隔开的,将按管道线的前后顺序执行,也就是说,shell要等待一个管道线执行完毕才能读下一个管道线。如果两个管道线之间是由“&”隔开的,那么前一个管道行异步地在后台执行。

例如:nohup cc prog.c &

其中cc是unix操作系统上所配的c语言的编译器。prog.c是用c语言编写的源程序。由于这个命令行用“&”结束,因此在编译器对源程序prog.c进行编译过程中,用户敲入中断键或键入quit命令退出系统,既不能中断、也不会退出编译的进行。

(3)nohup命令

其功能是运行一个命令,并且不受任何挂起(hangups)和退出的影响。

命令行格式:nohup command [arguments]

其中:command 代表要运行的命令的名字

arguments 表示参量。

注意:使用这个命令时,如果用户没有对输出进行重新定向,那么,它将把输出结果存放到nohup.out文件中;如果用户在当前目录下,不具有写操作权限,那么nohup命令的输出就被重新定向到$HOME/nohup.out。

(4)符号&&和||

符号& 使一些程序能在后台运行,究竟哪些程序可以在后台运行,要视情况而定。因此,“&”的使用也受到一些限制。特别是在系统负载比较重时,不宜启动过多的后台进程。

符号&&(and-if)与||(or-if)的作用是使管道线有条件地执行。它们在命令行上操作的优先级是相同的,并且低于操作符& 和| 的优先权。

||的格式为:cmd1||cmd2

其中cmd1、cmd2分别代表命令1和2。命令行的意义是,先执行命令cmd1,并对这个命令执行后的返回状态进行检测。只有在cmd1运行失败时(返回状态非零时认为运行失败,为零时表示运行成功)才执行命令cmd2。操作符||在这个命令行中的作用是进行条件判断,相当于下列语句:

if cmd1

test $? !=0

then

cmd2

fi

&&的格式:cmd1&&cmd2

其中&&的作用是进行一个与||互补的检测。其作用是:只要第一个命令cmd1

执行成功(返回状态为零),就执行第二个命令cmd2。

例如:cmd1&&cmd2&&cmd3&&…&&cmdn

在这个程序中,前一个命令执行成功,总是后一个命令执行的必要条件。

(5)小括号和大括号

一个管道行中的简单命令,可以由小括号或大括号括起来的命令清单进行替换。换名话说,命令清单由小括号或大括号括起来之后,可以用来取代管道行中的一个简单命令。被括起来的全部命令的输出构成一个流(stream),这个流作为该管道行中下一个命令的输入。

{命令1 参量…;命令2 参量…;…;…;}|命令

常用的几个语句

介绍几个与shell过程循环有关的语句。

(1) if语句

在shell中,if语句用于表示条件的结构中,最简单的使用为:

形式一:

if command-list1

then command-list2

fi

注意:

fi和if配对使用,fi总是放在这个条件语句的最后一行,表示if命令的结束。

command-list表示一个命令清单。如果命令清单1执行成功,接着执行单2 形式二:

if command-list1

then command-list2

else command-list3

fi

表示:

如果命令清单1执行成功,接着执行命令清单2,然后退出;否则转去执行命

令清单3。

形式三:

if command-list1

then command-list2

elif command-list3

then command-list4

else command-list5

fi

其意义为:

如果执行命令清单1为真,则执行命令清单2;否则,如果命令清单3为真,则执行命令清单4;全不为真时则执行命令清单5.

例如:if test -f “$1”

then pr $1

elif test -d “$1”

then (cd $1; pr *)

else echo $1 is neither a file nor a directory

fi

第一行检测位置参数$1的值是不是一个文件名,如果是,执行第二行,显示这个文件;如果不是一个文件名,执行第三行,继续检测参数$1的值是不是一个目录名字。如果是,则执行第四行,把当前目录改为$1,并且显示这个目录下的全部文件(由命令pr *实现)。否则执行第五行,显示$1,同时指出它既不是一个文件也不是一个目录。

(2)case语句

基本结构为:

case string in

pattern1) command-list1;;

……

patternn)command-listn;;

esac

其中string :表示一个字符串

pattern:表示一个满足一定形式的字符串

command-list:表示命令清单

在case语句中,shell依次用string字符串与字符串pattern1、pattern2…pattern 进行比较,如果同其中的某一个匹配,那么就执行这个pattern字符串后面的命令清单。

case语句中,除最后一个命令清单外,每个命令清单后都用;;结束。;;的作用是跳出case语句结构,结束case语句。

注意:

A. case语句中,任何情况上只有一个pattern字符串匹配,只有一个命令清单被执行。而string字符串与pattern字符串进行比较时是按顺序进行的。所以如果在case 结构中,星号* 作为第一个pattern字符串,那么就不会再检查其它pattern字符串了,字符比较就此结束。

B.如果有多个pattern字符串与一个命令清单相联,那么这些pattern字符串应该用竖杠|隔开。

例如:case $i in

*.c) cc $i;;

*.h|*.sh) ;;

*) echo “$i of unknown type”;;

esac

在这个例子中共有三个pattern字符:

*.c 匹配后缀为.c的任何字符串。

*.h|*.sh 两个字符串之间用竖杠| 分开,这是两个字符串与一个命令相关的

情况。

* 匹配任何字符串。

(3)条件循环语句

shell中条件语句通过while和until两个命令实现。

A.while的一般格式为:

while command-list1

do

command-list2

done

在这个结构中,第一个命令清单(command-list1)通常表示一定的条件,如果为真,或说条件满足,就执行循环体中第二个命令清单(command-list2),每执行一次返回command-list1,再判断条件是否为真,直到条件为假退出。

B.until 的一般格式:

until command-list1

do

command-list2

done

这个结构与while语句结构正好相反,如果命令清单command-list1为假,则执行命令清单command-list2; 如果命令清单command-list1为真就退出循环。

(4)for语句

shell中for语句是最常用的建立循环结构的语句。有时人们希望对一级文件中的每个文件进行操作,或对几个参量中的每一个均执行一次命令。for命令结构可以提供这种需要。

for语句格式:

for variable in word-list

do

command-list

done

此处,word-list是一个字符串清单,每个字符串之间由空格隔开。命令清单command-list中的命令对word-list中的每个字符串都要执行一遍。变量variable依次从字符串清单中取出每一个字作为它的值。

例如:for file in xec cmd word

do

diff $file.c /usr/src/sh/$file.c

done

例子中xec、cmd、word分别代表当前目录下的三个C语言的源程序文件xec.c、cmd.c、word.c。for循球结构使这三个C语言的源文件与目录/usr/src/sh中文件名相同的文件分别一一进行比较。因此徨体要执行三次。

for命令结构中,可以省略“in word-list”这一部分。如果没有这一部分,将把当前一组位置参量使用在字符串清单的位置上,也就是用位置参数取代字符串清单中的字符串。

例如文件TT包含下列内容:

for word

do echo $word

done

在这个结构中,变量是word,但没给出“in word-list”。给文件TT增加执行权限:chmod +x TT

敲入命令行:TT ma pa do

屏幕上将显示:

ma

pa

do

(5)循环控制语句

shell中,用于循环控制的命令是break和continue。break命令用来结束while 命令或for命令的循环,跳到下一个语句。而continue命令用来停止当前这一次循环, 重新启动下一次循环.break和continue命令仅仅在do和done之间出现时才起作用。

例如,下面是一个交互式的shell过程,名字为P1:

while true

do echo “please enter data”

read response

case “$rdponse”in

“ok”) break;;

“”)continue

esac

done

8.1.3.4 shell过程中的有关操作

1.命令分组

有两种方法可以把shell中的命令进行分组,一种是使用小括号,另一种是使用大括号。

(1) 小括号()

将使shell建立一个子shell,由这个子shell执行括号内的命令。左括号“(”和右括号“)”无论出现在命令行的什么地方,它们都能被识别出来。但是,如果括号被引号引起来,那么它们将失去本来意义,而仅仅作为一个普通字符。

把命令分组,创建子shell是很有用的。这样,在子shell这一级完成各种操作,不致于影响到当前shell(即父shell)中变量的值。还可以做到暂时改变当前目录,而在另外一个新目录下执行一些命令。在建立子shell的过程中,当前的环境(或称父shell环境)被传递给shell。

例如下面两行命令的作用相同:

DIR=`pwd`;cd /usr/otherdir;lc>temp; cd $DIR

(cd /usr/otherdir;lc>temp)

(1)大括号{}

也可以用来对命令进行分组。但使用方法和内部解释与小括号有所差别。只有当大括号的左边{和右边}作为命令的第一个字出现时,它们才能被识别。另外,使用大括号时并不建立子shell,仅仅是由shell去简单地执行大括号中的命令。

需说明:由小括号或大括号分组时,整个命令组的退出状态,是括号中最后一个命令执行后的退出状态。

2.定义函数

shell提供了定义函数的能力。函数与shell文本(scripts)或shell过程类似。函数通过shell进程执行,而不是通过一个单独的进程来执行。Shell函数的基本形式为:name() {list;}

这里,list可以包括前面介绍过的全体命令,name是函数的名字。

例如,定义一个函数,其名字为getyn:

getyn() {

while echo “$* (y/n)?\c”>&2

do

read yn

case $yn in

[yY] return 0 ;;

[nN] return 1 ;;

*) echo“Please answer y or n” >&2;;

esac

done

}

这个函数把“(y/n)?”附加到标准输出(文件描述符2)上,当输入时,可选择“Y”、“y”、“N”、“n”,所对应函数分别返回0或1。如果输入“Y”、“y”、“N”、“n”以外的任何情况,这个函数就提示用户进行正确的输入。

在shell中,用户自己定义的函数可以像其它命令一样使用,比如,可以这样使用上述getyn函数:getyn “Do you wish to continue”||exit

函数与命令的不同之处,是在函数中shell的位置参数$1、$2…$n,设置对应函数的自变量,而其它命令,位置参数都是与命令行中的参量对应的。

3.圆点命令

园点“.”是shell的一个命令,它的命令格式为: .file

其中,file是文件的名字。这个命令行将使shell读并执行来自这个文件的命令,然后返回。

例如: ..profile

8.1.4 特殊的shell命令

在shell中有几个特殊的命令,也称为shell的内部命令。一般情况下,这些内部命令比unix系统命令执行得更快、更有效。

1.符号:

这是一个空命令,它不做任何事情,仅仅用来在shell过程中插入一些注释。它的退出状态是零(真)。作为注释字符,其应用的大部分情况下,可以由符号#来替代。但应注意,#可以放在一选择尾部作为注释。而“:”命令则不能。使用冒号时,注意它的后面必须留一个空格。

2. cd arg

这里的arg是一个字符串,它表示一个目录的名字。这个命令的功能是使arg成为当前目录。如果arg不是一个有效的目录,或者用户没有得以授权可以对这个目录进行存取操作,那么执行这个命令将返回一个非零的退出状态。如果使用cd命令而没有给出arg时,等于敲入命令行:cd $HOME。

3. exec arg…

这个命令中arg也是一个字符串,如果arg表示的是一个命令,那么shell执行这个命令,并不建立子shell,执行完后返回当前shell。在这个命令行中,允许使用输入和输出重新定向参量。

例如,建立一个叫bb的shell过程:

a=`date`

echo $a

exec find / -name inittab -print

在根目录下,敲入命令行:sh bb

屏幕将显示:

Sat Mar 04 19:06:38bjt 1995

/etc/inittab

4.newgrp arg…

arg是shell命令。这个命令的功能是执行newgrp命令取代shell。newgrp按次序创建新shell。应注意,通过newgrp建立的shell中,只认识环境变量。这个命令的功能相当于如下命令行:exec newgrp arg…

5.pwd 显示当前的工作目录。

6.return n

使函数在退出时其返回值由n指定。n是一个数字值。如果没有指定n,返回状态就是最后执行的那个命令的退出状态。

7.times

显示时间值。它是当前shell进程运行的累计用户时间和系统时间。例如:# times 屏幕显示:0m6s 0m15s

表示运行shell进程所用的用户时间是6秒,系统时间是15秒。

8.type name

name是命令名字。执行命令行,显示出所列命令的查找路径。

例如:type lc cp diskcp

屏幕显示:lc is hashed(/bin/lc)

cp is /bin/cp

diskcp is /usr/bin/diskcp

其中lc已由hash命令定义。

9.ulimit [-f] n

这个命令行可以对shell建立起来的文件的大小进行限定。n是一个数字,表示要限定的文件块数。选项-f是一个标志,表示对子进程建立的文件的大小进行限定在n块以内。如果没有参量-f和n,那么当前文件大小的限制块数将被显示。

例如执行命令#ulimit 屏幕上将显示:4194304

表明目前系统允许shell建立的文件最大长度不行超过4194304块。10.umask nnn

用户文件创建掩码被设置为nnn。如果不给出nnn,当前的掩码值就被显示。在创建文件时,它被用来设置文件默认的操作权限。

8.1.5 shell过程

8.1.4.1 建立shell过程

建立一个shell过程的步骤如下:

第一步: 建立一个普通的shell文本文件(例proc)。

第二步: 改变这个文件的操作模式,使它成为一个可执行的文件。

第三步: 按下面的形式调用该shell:

proc args

其中proc表示程序名称,args表示所需参量。

在shell过程中,有几个执行标志很有用处:

-e标志在shell过程中如果有任何一个命令在执行后,其退出状态为非零,标志-e将使shell立即退出。

-u标志shell过程中,当置换变量的值出现错误时,这个标志将把不正确的变量值清除,因此,-u标志可用来对变量进行总检查。

-t标志当shell读并且执行完当前输入行上的命令后,这个标志将shell退出。

-n标志这是一个“不执行”标志。通常情况下,要检查一个shell过程是否有语法错误,只有运行这个过程才能发现。如果不想运行它。又能检查出语

法错误,就需要使用-n标志,方法是把命令行:set -nv 放在shell过

程的起始处即可。

-k标志它使那些具有:变量=值形式的参量被处理为关键字参数。在没有设置这个标志时,只有出现在命令名字之前的那些参量,被处理为关键字

参理。

8.1.4.2所支持的命令和特性

1. 条件检测命令test

test命令在条件判断、循环结构中使用最为普通,它的主要功能是:以指定的表达式进行计算,如果表达式的值为真,那么test命令返回一个零作为退出状态。否则,将返回一个非零退出状态(对应于表达式值为假的情况)。这个表达式是以test 命令的参数形式出现在命令行中。如果在test命令行中没有给出参量,也将返回一个非零退出状态。

命令格式:[expression] 或test expression

使用方括号也是test命令的一种形式。

expression是命令行的参量,一个条件表达式。条件表达式由一些具有专门意义的选项组合而成.

其中:

-r file 如果文件file存在,并对用户来说是可读的,test命令返回真。

-w file 如果文件file存在,并对用户来说是可写的,test命令返回真。

-x file 如果文件file存在,并对用户来说是可执行的,test命令返回真。

-s file 如果文件file存在,并且长度大于零,test命令返回真。

-d dir 如果dir是一个目录,test命令返回真。

-f file 如果file是一个普通文件,test命令返回真。

-z str 如果字符串str的长度为零,test命令返回真。

-n str 如果字符串str的长度不为零,test命令返回真。

s1=s2 如果字符串s1和字符串s2相等,test命令返回真。

s1!=s2 如果字符串s1和字符串s2不相等,test命令返回真。

s1 如果s1不是空字符串,test返回真。

n1 -eq n2 如果整数n1与n2相等,test命令返回真。-eq表示代数的等量关系。整数n1和n2

之间还可以是其它关系:

-ne 不等-gt 大于-ge 大于或等于

-lt 小于-le 小于或等于

上面所列出的是test命令经常使用的一些选项,也是测试条件。这些选项在命令行中可以单个使用,也可以组合使用。组合作用时,选项间要由适当的操作符连接。在test命令行中,可以使用的操作符有:

! 一元求“反”操作符

-a 二元逻辑“与”操作符(and)

-o 二元逻辑“或”操作符(or),其优先级低于逻辑“与”。

(expr) 此处的expr是一字符串,使用括号的意义是分组。括号里的部分在命令行中优先运算。

2。在屏幕上显示参量

在shell中,使用echo命令可以在屏幕上把命令行中的参量args显示出来。命令行的格式:

echo [options] [args]

其中:options 是命令的选项

args 是字符串。

echo命令把这些字符串拷贝到标准输出上的时候,字符串之间有一个空格作为间隔。可以使用echo命令来为用户输入时进行某些提示;也可以使用echo命令在shell过程中发布一些诊断信息;还可以在管道线中使用echo命令。

echo还有其它一些选项:“\选项字符”的形式

\b 空一格,使显示行首为一个空格。

\c 显示行没有输出。

\f 把arg的内容放到屏幕最顶端显示,如果原来屏幕上有其它内容,首先清屏。

\n 把arg的内容放到新行上显示。

\r 回车。

\t 显示行首为一个制表符。

\v 垂直制表符。

\\ 后斜杠。

上述这些符号,既可作为命令行的选项部分,对后面内容的显示格式起到控制作用,也可以单独使用.

3. 表达式求值expr

使用expr命令可以在整型数上进行算术操作和逻辑操作,以及在它的参量上进行字符串比较等操作。expr命令把表达式计算结果写到标准输出上,它还可以用来设置变量。

例如,建立可执行的shell文件a1:

a=2

b=3

c=`expr $a+$b`

echo $c $b $a

敲入命令行:# sh al回车,屏幕将显示:5 3 2

4. true命令和false命令

true和false命令的功能分别是使函数的退出状态为零和非零。这两个命令常用来完成无条件的循环。

例如:While true

do

echo ABC

done

将在屏幕上不间断地显示“ABC”,直到键盘接收到中断命令为止。

8.2 文件编辑器

本节简单地介绍文件编辑器vi的使用以及它的绝大部分命令。

8.2.1 vi基本操作

1.进入编辑状态

vi有两种工作方式(或称工作状态):即编辑方式和插入方式。在使用中,这两种方式经常相互转换。vi所有的命令都在编辑方式下敲入和执行;如果进入插入状态,所有从键盘输入的内容,都将成为正编辑的文件的一部分。

例如:建立一个名为test的文件,键入

# vi test

将出现:

进入了编辑方式。光标所在的行,称之为当前行;屏幕最底下的行,称之为状态行。

2. 插入文本

插入文本使用命令i。

例如:在文件test中进行插入信息

# vi test进入编辑方式,屏幕会出现上述的空文件。接着敲入命令i,进入插入方式。一旦进入插入状态,键盘输入的所有字符全部进入文件中去了,待信息全部输完后,按Esc键,退出插入方式。

若不知道目前处在什么方式下,按Esc键,如能听到终端响铃,表明当前是在命令状态。

3. 重复(repeat)执行命令

重复命令“ . ”,在vi中是一个频繁使用的命令。它的功能是重复执行刚刚执行过的命令。

例如:刚刚执行过插入命令,输入了一行内容。当该行敲完后,按回车,并按Esc 键,退出插入方式。接着敲入“ . ”,执行重复命令。这时候,屏幕显示增加了一行。这表明插入的内容原封不动地复制了一遍。重复命令可以连续使用。

在vi中,重复命令有它自己的使用范围。它仅重复最近一次使用的插入命令i,和最近一次使用的删除命令d。

4. Undo命令

这也是vi中一个很有用的命令,它是取消刚才的命令,Undo命令的这一特点,对于恢复那些使用不当的删除或插入操作是很有帮助的。

5. 移动光标

vi全屏幕编辑器,定义了几组光标移动键:

(1) 移动一个字符位置

在屏幕上自由地移动光标,除了使用键盘上的箭头以外,下面的字符键在vi中也是移动光标的控制键:

h 左移i 右移

k 上移j 下移

注意:光标移动键仅在命令方式下使用。每按下一次光标移动键,光标在当前位置上移动一个字

符的位置.

(2) 三个特殊字符

在vi中,大写字符K、L和G是对光标移动有着特殊作用的三个命令。

H 不管光标原来在什么位置,都将把光标移到屏幕的在上角。

L 不管光标原来在什么位置,都将把交标移到屏幕最底行。

G 使光标移到文件的最后一行。

(3) 光标的字移动、行移动命令

共有四个这样的命令,它们也都是由单个字符构成:

w 向前移动一个字 b 向后移动一个字

o 移到下一行的行首$ 移到下一行的行末

(4) 翻屏命令

在文本编辑过程中快速翻屏的四个命令:

ctrl+u 向上翻1/2屏crtl+d 向下翻1/2屏

ctrl+f 向前翻一屏ctrl+b 向后翻一屏

6.删除命令

许多删除命令是和光标移动命令结合在一起使用的,最常用的有:

dd 删除当前行(不管光标在行中的什么位置)。

dw 删除光标上的一个字。如果光标在一个字的中间,就从光标位置开始删到字的末尾。

x 删除光标上的一个字符。

d$ 从光标位置开始,删到行末。

D 同d$。

D0 从光标位置删到行首。

. 重复执行刚才的删除命令。

7.字符串查找

在vi的编辑状态下,查找命令的格式:/字符串

将会在文件中寻找字符串,找到匹配的字符串后,按n 继续往后查找下一个。8.查找和替换

如果一个文件有多处需要替换,例如把文件中所有的”AAA”,全部改成“BBB”,这就需要使用面向行的命令,面向行的命令可以完成多个操作。比如,既完成字符的查找,又完成它的替换。

所有面向行的命令都是以冒号“:”作前缀,冒号的作用是作为状态行的提示符。面向行的命令跟在冒号后输入,并以回车作为结束。

使用面向行的命令,把例子中所有的“AAA”改成“BBB”。在命令方式下,敲下::1,$ s/AAA/BBB/g

这行命令的意思是,从文件的第一行(1)到文件末尾($),不管在什么地方(g表示全程)查到“AAA”,就用“BBB”(s/AAA/BBB/)替换。

9.退vi

一个文件经过以上所作的编辑操作后,要想保留其内容,就需要存盘。存盘后,退出编辑状态,并返回到unix 提示符状态。

敲入命令行:

:x

回车后,文件名、文件行数、字符数都显示在状态行。比如:

“test”[New file]5lines,299characters

此时,出现unix系统的提示符。

10.从其它文件追加内容

test是一个已经存在的文件,假设要建立一个新文件test1,并把test的内容加到文件test1中去。

首先,建立新文件test1;

vi test1

这是一个空文件。可以使用行编辑命令read,将test文件中的内容,插入到新文件test1中。

在命令方式下,敲入命令行:

:r test

这时,文件test的内容,已经拷贝到文件test1中去了。

11.临时退出vi

vi允许临时跳出正在编辑的文件,去执行其它的命令。比如,用date命令。显示当前的时间和日期,敲入:

:!date

将出现

Mon Feb 26 14:48:27 CST 2001

[Hit return to continue]

12.改变显示

vi还有大量的可以设置的参数,例如:显示文件的行数。

敲入命令:

:set number

将会在屏幕的左侧显示带行号的文本。

vi可以使用的参数有几十个,这些选项非常有用,根据不同的情况,可以随意选择如何设置这些选项。参见vi相关文档资料。

13.强行退出编辑

对一个进行过编辑的文件,如果不想存盘,用下面的命令可以取消编辑,退出vi状态。

:q!

将退出文本编辑状态。

8.2.2 编辑的进入与退出

1.编辑文件

调用编辑器有多种方法,可以使用一个文件名来调用vi,也可以使用多个文件名同时进入编辑。

(1)编辑一个文件

进入vi最常用的方法就是敲入vi命令和所要编辑的文件名:vi filename

这里filename是文件名字。如果这个文件名不存在,那么,一个新的空文件就建立了。

(2)编辑多个文件

如果有多个文件需要进行编辑,每个文件的进入、退出都要占用时间。Vi可以同时调用多个文件,对多个文件进行编辑。

vi prog* 使所有以prog开头的文件进入编辑状态。

vi *.prg 使扩展名为“prg”的所有文件进入编辑状态。

vi [a-h]*.p 使以a-h任意一个字符打头,且扩展各为p的所有文件进入编辑状态。

Linux下shell程序设计

Linux下的Shell程序设计 Linux下的Shell程序设计 (1) 一.引言 (2) 1.1.编写目的: (2) 1.2定义: (2) 3.参考资料: (3) 二.任务的描述 (3) 2.1.目标: (3) 2.2功能描述: (3) 2.3.运行环境: (3) 2.4.条件与限制: (3) 三.任务设计 (4) 3.1.整体设计: (4) 3.2.详细设计: (5) 3.2.1.Menu模块: (5) 3.2.2. Add模块 (6) 3.2.3 Delete模块 (9) 四.实现过程 (10) 4.1.问题1 (10) 4.2.问题2 (11) 五.程序运行 (11) 5.1.程序运行的过程: (11) 5.1.1.执行效果截图 (11) 5.1.2.输入错误截图 (12) 5.1.3.选择菜单1,运行截图 (12) 5.1.4.选择菜单2,运行截图 (12) 5.1.5选择菜单3,运行截图 (12) 5.1.6 选择菜单5,运行截图 (12) 5.1.7 选择菜单6,运行截图 (13) 5.1.8 选择菜单7,运行截图 (13) 六、感想认识 (13) 七.程序代码 (14) 7.1.Menu模块 (14) 7.2.Add模块 (15) 7.3.Delete模块 (20)

一.引言 1.1.编写目的: 通过本课程设计,使学生巩固Linux和嵌入式系统的的基本概念、原理和技术,学会在Linux 系统下完成Shell程序设计。 1.2定义: 1)grep Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。 2)sort 将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。 3)rm rm 名称源自英文单词remove的缩写,用于删除文件系统中的文件、目录、设备文件、符号链接等对象。准确地说,rm移除的指向特定对象的引用。在文件系统中,这些特定的对象可能有多个引用(例如,两个不同的文件名可能指向相同的文件), 只有在一个对象不再有任何引用,并且没有任何程序还拥有这个文件的有效句柄的时候,这个文件才会被删除。4)cat 显示或者把多个文本文件连接起来。cat是concatenate的简写,类似于dos下面的type 命令。 5)more more命令,功能类似cat。more会以一页一页的显示方便使用者逐页阅读,而最基本的指令就是按空白键(space)就往下一页显示,按b键就会往回(back)一页显示,而且还有搜寻字串的功能。more命令从前向后读取文件,因此在启动时就加载整个文件。 6)awk awk是一个数字处理工具。相比于sed常常作用于一整行的处理,awk则比较倾向于将一行分为数个“字段”来处理。运行效率高,而且代码简单,对格式化的文本处理能力超强。awk 是”Aho Weiberger and Kernighan”三个姓的第一个字母缩写。 7)sed sed是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

实验二 Linux shell程序设计总结

实验二Linux shell程序设计 一、实验目的 熟悉linux shell 简单程序设计 二、实验内容 1、变量引用。在用户主目录下运行如下命令 $dir_1=/11/22 $echo $dir_1 $echo dir_1 2、数组。在用户主目录下运行如下命令 $city[0]=Beijing $city[1]=Shanghai $city[2]=Tianjin 显示city的第二个元素的值 $A=(this is an example of shell script) (1)同时显示数组A的第2、4、6个元素的值。 (2)显示所有数组元素的值 3、完成书上P106-107中关于read命令的使用的例子。 4、完成书上p108-110例4.7-例4.9

三、实验步骤 1.输入命令: $dir_1=/11/22 $echo $dir_1 $echo dir_1 2.输入命令: $city[0]=Beijing $city[1]=Shanghai $city[2]=Tianjin $echo ${city[2]} $A=(this is an example of shell script) $echo ${A[2]} ${A[4]} ${A[6]} $echo ${A[8]} 3.输入命令: $read x y z Today is Monday $echo $z $x $y $read n1 n2 n3 First Second Third 1234 abcd $echo $n3 $echo $n2 $n1

Read n1 n2 n3 1 2 $echo $n3 $echo $n1 $n2 4.4-7:$touch m1.c $vi m1.c 按”i”输入:main() { printf(“Begin\n”); } 按“Esc”输入“:wq” $cat m1.c $touch m2.c $vi m2.c 按”i”输入:main() { printf(“OK!\n”); printf(“End\n”); } 按“Esc”输入“:wq”

LINUX-Shell编程实验报告

《LINUX管理与应用》课程实验报告 ≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡

一、实验过程 1. 编写一个简单的回显用户名的shell程序 2. 使用if-then语句创建简单的shell程序 3. 使用if-then-else语句创建一个根据输入的分数判断是否及格的shell程序 4. 使用for语句创建简单的shell程序 5. 使用while语句创建一个计算1-5的平方的shell程序 6. 用shell设计一个模拟考勤程序 二、实验结果 1.编写一个简单的回显用户名的shell程序 #vi dat #!/bin/bash # echo "Mr.$USER,Today is:" echo `date` echo Wish you a lucky day! #chmod +x dat #./dat 2. 使用if-then语句创建简单的shell程序 #vi bbbb #!/bin/bash # echo -n "Do you want to continue: Y or N" read ANSWER if [ $ANSWER = N -o $ANSWER = n ] then echo "your answer is quit!" fi

#chmod +x bbbb #./bbbb 3. 使用if-then-else语句创建一个根据输入的分数判断是否及格的shell程序 #vi ak #!/bin/bash # echo -n "please input a score:" read SCORE echo "You input Score is $SCORE" if [ $SCORE -ge 60 ]; then echo -n "Congratulation!You Pass the examination." else echo -n "Sorry!You Fail the examination!" fi echo -n "press any key to continue!" read $GOOUT #chmod +x ak #./ak 4. 使用for语句创建简单的shell程序 #vi mm #!/bin/bash # for ab in 1 2 3 4 do echo $ab

linux下shell 程序设计_毕业课程设计

linux下shell 程序设计 shell编程 教学要点 1.深入理解shell概念。 2.掌握linux下shell程序设计流程。 3.理解shell程序与C程序设计的区别。 4.掌握shell程序设计中用户变量和表达式的使用方法。一.Shell编程概述 问题1:请各位同学在home目录下创建5个目录,目录名称分别为student0,student1,student2,student3,student4.且修改它们的权限为所有用户都具有完全的操作权限。 问题2:请各位同学在home目录下创建100目录,目录名称为class1—class100. 解决办法:通过一个shell脚本程序来实现,程序如下,用vi编辑器建立一个firstshell文件,内容如下: #!/bin/bash //指明该程序被那个shell来执行!

cd /home/shelldir //进入home/shelldir目录 mkdir newdir //在shelldir目录下新建newdir目录 i=0 //给变量i赋初值 while [ $i –lt 50 ]; do //循环,判断i是否小于50,成立继续循环 let i=i+1 //让i变量值增加1 mkdir /home/shelldir/newdir/student$i //在newdir目录下创建student1到student50 chmod 754 /home/shelldir/newdir/student$i done 保存文件,退出vi,通过执行#chmod a+x firstshell修改文件权限,赋予文件可执行权限,通过#./firstshell或者#/bin/bash firstshell来执行程序,查看程序运行结果。 程序说明: 1.程序必须以下面的行开始(必须方在文件的第一行): #!/bin/bash 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/bash来执行程序。

shell程序设计

shell编程 教学要点 1.深入理解shell概念。 2.掌握linux下shell程序设计流程。 3.理解shell程序与C程序设计的区别。 4.掌握shell程序设计中用户变量和表达式的使用方法。一.Shell编程概述 问题1:请各位同学在home目录下创建5个目录,目录名称分别为student0,student1,student2,student3,student4.且修改它们的权限为所有用户都具有完全的操作权限。 问题2:请各位同学在home目录下创建100目录,目录名称为class1—class100. 解决办法:通过一个shell脚本程序来实现,程序如下,用vi编辑器建立一个firstshell文件,内容如下: #!/bin/bash //指明该程序被那个shell来执行! cd /home/shelldir //进入home/shelldir目录 mkdir newdir //在shelldir目录下新建newdir目录

i=0 //给变量i赋初值 while [ $i –lt 50 ]; do //循环,判断i是否小于50,成立继续循环 let i=i+1 //让i变量值增加1 mkdir /home/shelldir/newdir/student$i //在newdir目录下创建student1到student50 chmod 754 /home/shelldir/newdir/student$i done 保存文件,退出vi,通过执行#chmod a+x firstshell修改文件权限,赋予文件可执行权限,通过#./firstshell或者#/bin/bash firstshell来执行程序,查看程序运行结果。 程序说明: 1.程序必须以下面的行开始(必须方在文件的第一行): #!/bin/bash 符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/bash来执行程序。 2.当编辑好脚本时,如果要执行该脚本,还必须使其可执行。要使脚本可执行,必须为脚本添加可执行权限。

Linux上机练习题shell程序设计基础

上机实习题: 1.用Shell编程,判断一文件是不是字符设备文件,如果是将其拷贝到 /dev 目录下。a #!/bin/bash directory=/dev for file in /bin/a2p do if [ -f $file ] then cp $file $directory/$file.bak Fi done 2.编写一个 shell 脚本,完成功能: 1)显示文字“Waiting for a while….” 2)长格式显示当前目录下面的文件和目录,并输出重定向到 /home/file.txt 文件 3)定义一个变量,名为 s,初始值“Hello” 4)使该变量输出重定向到/home/string.txt 文件 m #!/bin/bash echo "waiting for a while… " ls -l.>/home/file.txt s=hello

echo $s > /home/string.txt 3.编写一个 shell 脚本,它把第二个位置参数及其以后的各个参数指定的文 件复制到第一个位置参数指定的目录中。b #!/bin/bash dir=$1 shift while [$1] do file=$1 cp $1 $dir shift done ls $dir 4.编写一个 shell 脚本,利用 for 循环将当前目录下的.c 文件移动到指定 的目录,并按文件大小显示出移动后指定的目录的内容。d #!/bin/bash for file in *.c

{ mv /$file/bin/a } ls -lS /bin/a 5.利用数组形式存放 10 个城市的名字,然后利用 for 循环把它们打印出 来。c #!/bin/bash city=(jinan,qingdao,rizhao,weifang,beijing,shanghai,shenzhen,guangzhou,chongqi ng,nanjing) for i in ${name[*]} do echo $i done 6.设计一个shell程序,添加一个新组为class1,然后添加属于这个组的30 个用户,用户名的形式为stdxx,其中xx从01到30。 f !/bin/bash groupadd class1 for ((i=1;i<=30;i++)) do if [ $i -lt 10 ];then username="std0"$i else username="std"$i

实验一Shell程序设计已完成

Shell程序设计 一、实验目的 1、了解和熟悉创建并使用脚本的步骤。 2、熟悉bash的控制结构。 3、学会简单的shell编程。 二、实验内容 1、创建一个简单的列目录和日期的shell 脚本并运行之。 2、用Shell 语言编制Shell 程序,该程序在用户输入年、月之后,自动打印数出该年该月的日历。 3、编程提示用户输入两个单词,并将其读入,然后比较这两个单词,如果两个单词相同则显示“Match”,并显示“End of program”,如果不同则显示“End of program”。 4、编程使用case 结构创建一个简单的菜单,屏幕显示菜单: a. Current date and time b. User currently logged in c. Name of the working directory d. Contents of the working directory Enter a,b,c or d: 三、实验步骤 1、创建一个简单的列目录和日期的shell脚本并运行之。 步骤: 键入下列命令,创建一个新文件: (1)cat >new_script (2)输入下列行: echo Your files are ls echo today is date 按回车键将光标移到一个新行,按ctrl + D 键保存并退出。 (3)检查文件内容,确保它是正确的: #cat new_script (4)运行脚本,输入它的文件名: #new_script 该脚本不运行。 (5)输入下列命令,显示文件的权限: #ls -l new_script 权限表明该文件不是可执行。要通过简单调用文件名来运行脚本,必须有权限。 (6)输入下列命令,使new_script变成可执行文件。 chmod +x new_script (7)要查看新的权限,输入: ls-l 现在拥有文件的读、写和执行权限。 (8)输入新脚本的名字以执行它: new_script 所有输入到文件的命令都执行,并输出到屏幕上。

LinuShell程序设计实验

Linux shell程序设计实验指南 请在vi中逐一编辑并执行以下10个shell脚本程序,然后结合所学知识和程序的输出分析各程序中各语句的含义: 1.编写一个简单的回显用户名的shell程序。 #!/bin/bash #filename:date echo "Mr.$USER,Today is:" echo 'date' echo Whish you a lucky day! 2.使用if-then语句创建简单的shell程序。 #!/bin/bash #filename:bbbb echo -n "Do you want to continue: Y or N" read ANSWER if [ $ANSWER=N -o $ANSWER=n ] then exit fi 3.使用if-then-else语句创建一个根据输入的分数判断是否及格的shell程序。 #!/bin/bash #filename:ak echo -n "please input a score:" read SCORE echo "You input Score is $SCORE" if [ $SCORE -ge 60 ]; then echo -n "Congratulation!You Pass the examination." else echo -n "Sorry!You Fail the examination!" fi echo -n "press any key to continue!" read $GOOUT 4.使用case语句创建一个菜单选择的shell程序。 #!/bin/bash #filename:za #Display a menu echo _ echo "1 Restore"

7Shell编程

实训项目7 Shell 编程 一、实训目的 ● 掌握Shell 环境变量、管道、输入输出重定向的使用方法。 ● 熟悉Shell 程序设计。 二、项目背景 某单位的系统管理员计划用Shell 编程编写一个程序实现USB 设备的自动挂载。程序的功能如下: ● 运算程序时,提示用户输入“y ”或“n ”,确定是不是挂载USB 设备。 ● 如果用户输入“y ”,则挂载这个USB 设备。 ● 提示用户输入“y ”或“n ”,确定是不是复制文本。 ● 如果用户输入“y ”,则显示文件列表,然后提示用户是否复制文件。 ● 程序根据用户输入的文件名复制相应的文件,然后提示是否将计算机中的文件复制到USB 中。 ● 完成文件的复制以后,提示用户是否卸载USB 设备。 三、实训内容 练习Shell 程序设计方法及Shell 环境变量、管道、输入输出重定向的使用方法。 四、实训步骤 ●在Linux 系统的图形界面下利用Vi 编辑器输入程序代码,部分主要程序代码如下。 ● 将文件保存为/program/usb.sh ,并利用chmod 命令修改usb.sh 的权限,使其可以执行。 ● 设置PATH 环境变量,将/program 目录添加到系统的PATH 环境变量中,使得每次直接执行 usb.sh

就可以完成U盘的自动挂载。 ●去掉usb.sh的执行权限,将改文件的内容分别利用输出重定向输出到/program/usbbak.sh文件和屏幕上。 五、实训思考题 1.将本实训的USB项目的程序完成,并进行实际测试。写出测试环境和测试结果。 2.修改系统的配置文件,使得usb.sh文件在用户每次登陆系统的时候可以自动执行。 六、实训报告要求 ●实训目的。 ●实训内容。 ●实训步骤。 ●实训中的问题和解决方法。 ●回答实训思考题。 ●实训心得与体会。 ●建议与意见。 1

题目1 shell 程序设计

题目1 shell 程序设计 1.1 实验目的 Linux操作系统中shell是用户与系统内核沟通的中介,它为用户使用操作系统的服务提供了一个命令界面。用户在shell提示符($或#)下输入的每一个命令都由shell先解释,然 后传给内核执行。本实验要求用C语言编写一个简单的shell程序,希望达到以下目的: ●用C语言编写清晰易读、设计优良的程序,并附有详细的文档。 ●熟悉使用Linux下的软件开发工具,例如gcc、gdb和make。 ●在编写系统应用程序时熟练使用man帮助手册。 ●学习使用POSIX/UNIX系统调用、对进程进行管理和完成进程之间的通 信,例如使用信号和管道进行进程间通信。 ●理解并发程序中的同步问题。 ●锻炼在团队成员之间的交流与合作能力。 1.2 实验要求 1.2.1 ysh解释程序的重要特征 本实验要实现一个简单的命令解释器,也就是Linux中的shell程序。实验程序起名为ysh,要求其设计类似于目前流行的shell解释程序,如bash、csh、tcsh,但不需要具备那么复杂的功能。ysh程序应当具有如下一些重要的特征: ●能够执行外部程序命令,命令可以带参数。.。 ●能够执行fg、bg、cd、history、exit等内部命令。 ●使用管道和输入输出重定向。 ●支持前后台作业,提供作业控制功能,包括打印作业的清单,改变当前 运行作业的前台/后台状态,以及控制作业的挂起、中止和继续运行。 除此之外,在这个实验中还须做到: ●使用make工具建立工程。 ●使用调试器gdb来调试程序。 ●提供清晰、详细的设计文档和解决方案。 1.2.2 ysh解释程序的具体要求 1. Shell程序形式 本实验的ysh程序设计不包括对配置文件和命令行参数的支持。如果实现为像bash那样支持配置文件,当然很好,但本实验并不要求。ysh应提供一个命令

实验1 Shell程序设计

齐鲁工业大学实验报告成绩 一、实验目的及要求 理解Shell程序的设计方法; 熟悉Shell程序编辑、运行、调试方法与过程。 二、实验过程及结果【相应实验步骤中的主要操作过程、核心源码及运行结果截图】 1.编写一个简单的回显用户名的shell程序 #vi dat #!/bin/bash #filename:dat echo "Mr.$USER,Today is:" echo `date` echo Wish you a lucky day! #chmod +x dat #./dat 2.使用for语句创建简单的shell程序 #vi mm #!/bin/bash #filename:mm for ab in 1 2 3 4 do echo $ab done

#chmod +x mm #./mm 3.使用while语句创建一个计算1-5的平方的shell程序 #vi zx #!/bin/bash #filename:zx int=1 while [ $int -le 5 ] do sq=`expr $int \* $int` echo $sq int=`expr $int + 1` done echo "Job completed" #chmod +x zx #./zx … 三、实验总结及收获【学到的知识和技能、遇到的问题及解决方案、心得体会等】

通过这次实验,我懂得了定义SHELL程序设计中的变量,掌握了SHELL程序中LINUX 基本命令的使用,理解了Shell程序的设计方法,并且熟悉了Shell程序编辑、运行、调试方法与过程。这为我日后继续深入学习Linux课程打下基础。

考勤模拟shell程序设计(推荐文档)

实验报告 课程名称:Linux程序设计 实验项目:考勤模拟shell程序设计专业班级:计算机科学与技术0903 姓名:学号: 实验室号:信息楼实验组号: 实验时间:2012.12.15 批阅时间: 指导教师:李威成绩:

沈阳工业大学实验报告 一.实验名称: 考勤模拟shell程序设计 二.实验目的: 理解Shell程序的设计方法;熟悉Shell程序的编辑、运行、调试方法与过程。 三.实验内容: 考勤模拟Shell程序设计 用shell设计一个模拟考勤程序,实现如下功能选择界面: 1:上班签到 2:下班签出 3:缺勤信息查阅 考勤程序运行后,提示用户输入上述功能选择,并验证用户输入的用户名和密码;用户信息保存在userinfo.dat中。 如果是上班签到,记录签到信息,如果签到时间大于上午8时,则提示用户迟到,并记录该迟到信息到check.dat中。 如果是下班签出,记录签出信息,如果签出时间小于下午6时,则提示用户早退,并记录该早退信息到check.dat。 如果用户选择确信信息查询,则将check.dat中对应的用户迟到早退的信息查询出来并显示。 用户选择功能执行完,Shell程序继续回到功能选择界面等待下一个用户进行操作。

四.实验要求: 1、掌握Shell程序的编辑、运行、调试方法 2、完成实验内容要求是现的功能 3、撰写实验报告 五.试验运行代码: #! /bin/bash exsig=0 while true; do echo "" echo "----欢迎使用本系统----" echo " 1. 上班签到" echo " 2. 下班签出" echo " 3. 考勤信息查询" echo " 4. 退出系统" echo "----------------------" echo "" echo "请输入你的选项:" read choice case $choice in 1)echo "请输入你的名字:" read name echo "请输入你的密码:" read password if test -r /home/user/userinfo.dat then while read fname fpassword do echo "$fname" echo "$fpassword" if test "$fname" = "$name" then break fi done < /home/user/userinfo.dat else echo System Error:userinfo.dat does not exist! fi if test "$fname" != "$name" then

Linux上Shell程序设计实验报告

深圳大学实验报告 课程名称:Linux操作系统 实验项目名称:Linux上shell程序设计 学院:计算机与软件学院 专业:软件工程 指导教师:冯禹洪 报告人:文成学号:2011150259 班级: 2 实验时间:2013-10-08 实验报告提交时间:2013-10-30 教务处制

一、实验目标: 1. 熟悉vi编辑器的使用 2. 掌握简单的Shell编程 2.1. 掌握Shell变量的使用 2.2. 掌握Shell表达式的使用 2.3. 掌握Shell流程控制语句的使用 3. 熟悉Shell程序的执行和跟踪 二、实验环境与工件 湖边Linux实验室 Fedora 13 三、实验内容与步骤 1. 下面哪个命令会实现将变量V AR1和V AR2相加,并且值存入变量V AR3的功能?( D )(5分) [ $V AR3 = $V AR1 + $V AR2 ] $V AR3 = [ $V AR1 + $V AR2 ] $V AR3 = (( V AR1 + V AR2 )) (( V AR3 = V AR1 + V AR2 )) 2. 以下程序的输出是?( D )(5分) #!/usr/bin/sh A=1 while [ $A -lt 10 ] do B=1 while [ $B -lt 10 ] do break 2 echo "Inner loop" done echo "Outer loop" done A.“Inner l oop” 将被打印10次 B.“Outer l oop” 将被打印10次. C.“Outer l oop” 将被打印10次. D.什么都没有被打印.

shell程序设计(通信)1报告

Shell程序设计 本章的学习目标 ●了解shell的地位和作用 ●熟练掌握shell脚本的建立与执行方法 ●掌握shell的变量及特殊字符 ●掌握shell的输入输出命令 ●掌握shell程序逻辑结构语句 主要内容 ● Shell概述 ● Shell的变量 ● Shell中的特殊字符 ●Shell编辑中的输入输出命令 ● Shell结构控制语句 Shell简介 1、Shell的功能(1)作为命令解释程序 (2)作为一种高级程序设计语言 shell是一种命令行解释程序,它提供了用户与操作系统之间基于命令行的交互界面。用户命令行输入命令,由SHELL对它们做出解释,并将其送往操作系统去执行。然而,它不仅仅是一种交互式语言,它还是一种可编程的程序设计语言。将若干个shell命令写入一个文件就构成了一个shell程序,它可以被shell逐条的解释执行。 Shell简介 shell程序可以使用各种变量、参数和控制结构来组织命令流程,自动化的完成各种复杂冗繁的处理工作。 shell是基于字符串的语言:只做字符串处理,不支持复杂的数据结构和运算。Shell 输出也全部是字符方式。 2、Shell的主要版本:sh csh ksh 在linux系统中流行的使用的shell主流是Bash,它是Bourne Again Shell的缩写,bash 是由bourne shell发展而来的,但是它包含了csh和ksh的特性。 shell脚本的建立与执行 ●shell脚本的建立 ●Shell脚本是文本文件,可以用任何文本编辑器建立和编辑脚本,shell脚本文件 的名称没有限定的扩展名,通常不带扩展名或带“.sh”扩展名。 ●①vi shell脚本名 ●②cat >文件名 ●。。。。。 Ctrl+d 例9.1 第1个Shell程序: $ cat hello #hello程序 # This is a shell script to say hello. echo Hello World! echo -n “Today is ” date “+%A, %B %d, %Y.” $ . hello #运行hello程序 Hello World!

实验3:Shell程序设计

实验报告3 课程名称:Linux驱动程序开发实验名称:Shell程序设计 学生姓名:班级:学号: 指导老师:钱振江成绩: 一、实验目的 1.Shell程序设计中变量的使用; 2.理解通道的概念并初步掌握它的使用方法; 3.掌握算术操作、字符串操作、逻辑操作、文件操作; 4.掌握if then fi、if then elif fi、case、while、for等控制语句; 5.在shell脚本中使用函数; 二、实验任务与要求 1.通过对shell程序的调试,理解变量$#,$0,$1,$2,$3,$@的含义; 2.Shell顺序程序设计; 3.Shell分支程序与多分支程序设计; 4.Shell循环程序设计。 三、实验工具与准备 计算机PC机,Linux Ubuntu操作系统 预备知识 1.环境变量:$HOME; $PATH; $PS1; $1~$9; $*; $@; $#; $$; $?; $!等。 $0是一个内部变量,它是必须的,而$1则可有可无,最常用的内部变量有$0、$#、

$?、$*,它们的含义如下: ?$0 :命令所在的路径 ?$# :传递给程序的总的参数数目 ?$? :shell程序在shell中退出的情况,正常退出返回0,反之为非0值 ?$* :传递给程序的所有参数组成的字符串 2.字符串比较有=、!=、-n、-z;算术运算有-eq、-ge、-le、-ne、-gt、-=lt;逻辑运算有!、-a、-o;文件测试-d、-f、-x等; 3.for 循环 ?语法: for 变量in 列表 do 操作 done 4.while循环 ?语法: while 表达式 do 操作 done 5.until循环 ?语法: until 表达式

实验五 Shell程序设计

实验五Shell程序设计 1.编写一个Shell程序findit,该程序搜索参数1指定的目录树,查找所有的以.c和.h结尾的文件,如文件行中含有参数指定的字符串,显示该行和相应的文件名。如目录参数1缺省,则从当前目录中搜索。如:findit /home/wang/work searchstring 搜索以/home/wang/work为根的目录树中的c程序和头文件,查找含有searchstring字符串的行,显示文件名。 findit searchstring 从当前目录开始搜索。 2.编一Shell程序,以类似书本的目录结构的形式,按层次输出当前目录树中的所有目录和文件,要求每一层缩进4个空格。 /* sockcom.h */ #include #include #include #include #include #include #include #include #define BUFSIZE 1024 #define PORT 3333 typedef struct fileinfo { char fname[50]; long length; }FILEINFO, *Pfileinfo; /* * SocketServer.c * */ #include "sockcom.h" int initSocket() { int sockfd, length; struct sockaddr_in server; char buf[BUFSIZE];

Linux上机练习题shell程序设计基础

上机实习题: 1.用编程,判断一文件是不是字符设备文件,如果是将其拷贝到目录下。a 2p [ $ ] $ $$ 2.编写一个脚本,完成功能: 1)显示文字“ a ….” 2)长格式显示 当前目录下面的文件和目录,并输出重定向到文件 3)定义一个变量,名为 s,初始值“” 4)使该变量输出重定向到文件 m " a … " .> $s >

3.编写一个脚本,它把第二个位置参数及其以后的各个参数指定的文件复 制到第一个位置参数指定的目录中。b $1 [$1] $1 $1 $ $ 4.编写一个脚本,利用循环将当前目录下的文件移动到指定的目录,并 按文件大小显示出移动后指定的目录的内容。d * { /$

} 5.利用数组形式存放 10 个城市的名字,然后利用循环把它们打印出来。 c () i ${[*]} $i 6.设计一个程序,添加一个新组为1,然后添加属于这个组的30个用户,用 户名的形式为,其中从01到30。 f 1 ((1<=30)) [ $i 10 ] "0"$i ""$i 1 $

7.编写程序,实现自动删除50个账号的功能。账号名为1至50。 1 [$10] [$10] 0${i} ${i} ' $1' 8.请写出下列程序在命令行执行#3 100 运行后的结果(程序名为3)。 “ $# .” “ :$0” “1 :$1”

“2 :$1” “3 :$3” 9.设计一个菜单驱动程序。如下: : P: S: D: ’s L: W: Q: : 菜单程序将根据用户输入的选择项给出相应信息。要求对用户的输入忽略大小写,对于无效选项的输入给出相应提示。要求使用语句实现以上功能,输入响应的字母后应该执行响应的命令完成每项功能,如输入P,就执行命令。 #! # " :" " 's " " " " " " " "$" D) ;; L) ;; W) ;; Q) 0;;

Linux上Shell程序设计

深圳大学实验报告课程名称:Linux操作系统 实验项目名称:Linux上shell程序设计学院:计算机与软件学院 专业: 指导教师:冯禹洪 报告人:学号:班级: 实验时间: 实验报告提交时间: 教务处制

一、实验目标: 1. 熟悉vi编辑器的使用 2. 掌握简单的Shell编程 2.1. 掌握Shell变量的使用 2.2. 掌握Shell表达式的使用 2.3. 掌握Shell流程控制语句的使用 3. 熟悉Shell程序的执行和跟踪 二、实验环境与工件 湖边Linux实验室 Fedora 13 三、实验内容与步骤: 准备工作:如果当前系统已经有学生名字加学号命名的账号,则直接以该账号登录,然后转2,一次完成后面的实验内容。 i.创建一个以学生名字加学号命名的账号,不如,学生名字 为张山,学号为123,则操作如下: #useradd zhangshan123 #passwd zhangshan123 然后以zhangshan123名字登录 ii.在主目录下 a)创建文件夹:ShellProgram $mkdir ShellProgram b)进入ShellProgram子目录 $cd ShellProgram iii.请根据自己对Linux的熟悉程度选做题(一)或题(二) 题(一) 1. 下面哪个命令会实现将变量V AR1和V AR2相加,并且值存入变量V AR3的功能?()(5分)

A.[ $VAR3 = $VAR1 + $VAR2 ] B.$VAR3 = [ $VAR1 + $VAR2 ] C.$VAR3 = (( VAR1 + VAR2 )) D.(( VAR3 = VAR1 + VAR2 )) 2. 以下程序的输出是?()(5分) #!/usr/bin/sh A=1 while [ $A -lt 10 ] do B=1 while [ $B -lt 10 ] do break 2 echo "Inner loop" done echo "Outer loop" done A.“Inner l oop” 将被打印10次 B.“Outer l oop” 将被打印10次. C.“Outer l oop” 将被打印10次. D.什么都没有被打印. 3. 请在vi中逐一编辑,修正(如果有误)并执行以下10个shell脚本程序,然后结合所学知识和程序的输出理解各程序中各语句的含义,对各小题附上结果截图。(每小题5分) 3.1. 编写一个简单的回显用户名的shell程序。 #!/bin/bash #filename:date echo "Mr.$USER,Today is:" echo 'date' echo Whish you a lucky day! 3.2.使用if-then语句创建简单的shell程序。 #!/bin/bash

《Linux应用程序设计》复习题2

.一、选择题 1.下面哪个命令是用来定义shell的全局变量( D ) A. exportfs B. alias C. exports D. export 2. 将当前目录下的文件shell.sh移动到目录/home/linux下的命令为(B)。 A. cp shell.sh /home/linux B. mv shell.sh /home/linux C. lls shell.sh / home/linux/shell.sh D. mv /root/shell.sh /home/linux/shell.sh 3.如果要列出一个目录下的所有文件需要使用命令行( C )。 A. ls –l B. ls-t C. ls –a D. ls –d 4.Linux 下Makefile文件中,表示第一个依赖目标的系统变量是(C) A.$@ B.$* C.$< D.$# 5.32位系统下,定义一个指向字符类型的变量short i,那么sizeof(i)的值是( B ) A.1 B.2 C.3 D.4 6.在用ls –l 查看文件属性时,字符设备文件类型的标志是( A ) A.c B.b C.s D.l 1、- -------------- 普通文件 2、d -------------- 目录文件 3、l -------------- 符号连接 4、c -------------- 字符设备文件 5、b -------------- 块设备文件 7. 在linux下进行shell编程时,注释符是(A)。 A. # B. // C. /* */ D. 以上都不对 8. 任何时候用户需要回到用户主目录时可以使用命令(A)。 A. cd B. pwd C. path D. cd . 9. 下列属于文件包含的命令是(C)。 A. #define N 25 B. #endif C. #include "stdio.h" D. #else 10. 下列关于Linux安装的说法中,不正确的是(C)。 A.如果计算机的内存为128MB,则SWAP分区(交换分区)的大小通常设定为256M。 B.安装时Linux分区的文件系统类型一般为ext2或ext3。 C.安装时要进行磁盘分区,如果选择“自动分区”,系统会自动保留硬盘上原来的数据。 D.Linux除了可以从光盘安装外,还可以从网上下载Linux的iso映像文件,从硬盘安装。 11. 下列说法中,不正确的是 A 。 A. Shell程序编写完后还需要用gcc编译器编译。

相关文档