当前位置: 东星资源网 > 文档大全 > 接收函 > 正文

shell接收函数返回值

时间:2017-05-21 来源:东星资源网 本文已影响 手机版

篇一:Linux Shell 实现随机数多种方法

Linux Shell 实现随机数多种方法 在日常生活中,随机数实际上经常遇到,想丢骰子,抓阄,还有抽签。呵呵,非常简单就可以实现。那么在做程序设计,真的要通过自己程序设计出随机数那 还真的不简单了。现在很多都是操作系统内核会提供相应的api,这些原始参数是获取一些计算机运行原始信息,如内存,电压,物理信号等等,它的值在一个时 间段可以保证是唯一的了。好了,废话我就不说了。呵呵。 shell脚本程序我们有那些获得随机数方法呢?

一、通过时间获得随机数(date)

这个也是我们经常用到的,可以说时间是唯一的,也不会重复的,从这个里面获得同一时间的唯一值。适应所有程序里面了。

例子:

[chengmo@centos5 shell]$ date +%s

1 1287764773

2 #获得时间戳,当前到:1970-01-01 00:00:00 相隔的秒数 3 #如果用它做随机数,相同一秒的数据是一样的。在做循环处理,多线程里面4 基本不能满足要求了。

5

6 [chengmo@centos5 shell]$ date +%N

7 738710457

8 #获得当前时间的纳秒数据,精确到亿分之一秒。

9 #这个相当精确了,就算在多cpu,大量循环里面,同一秒里面,也很难出现10 相同结果,不过不同时间里面还会有大量重复碰撞

11

12 [chengmo@centos5 shell]$ date +%s%N

13 1287764807051101270

#这个可以说比较完美了,加入了时间戳,又加上了纳秒

通过上面说明,用它来做随机数的基数了,接下来我们看怎么样获得一段数据内怎么样获得随机数。

1 #!/bin/sh

2

3 #写个随机函数,调用方法random min max

4 #在min 与 max直接获得随机整数

5 #copyright chengmo QQ:8292669

6

7

8 #获得随机数返回值,shell函数里算出随机数后,更新该值

9 function random()

10 {

11 min=$1;

12 max=$2-$1;

13 num=$(date +%s+%N);

14 ((retnum=num%max+min));

15 #进行求余数运算即可

16 echo $retnum;

17 #这里通过echo 打印出来值,然后获得函数的,stdout就可以获得18 值

19 #还有一种返回,定义全价变量,然后函数改下内容,外面读取 20 }

21

22 #得到1-10的seq数据项

23 for i in {1..10};

24 do

25 out=$(random 2 10000);

26 echo $i,"2-10000",$out;

done;

看看运行结果:

[chengmo@centos5 shell]$ sh testrandom.sh

1,2-10000,5600

2,2-10000,5295

3,2-10000,3432

4,2-10000,3148

5,2-10000,9041

6,2-10000,4290

7,2-10000,2380

8,2-10000,9009

9,2-10000,5474

10,2-10000,3664

一个循环里面,得到值各不相同。

这个是我们常用方法,适应各种语言,是一个通用算法,就算服务器不提供,某时刻相同唯一数据标记,我们也可以通过这种方法,做自己的伪随机数。下面还有更简单方法呢,不要我们自己做了。

2、通过内部系统变量($RANDOM)

其实,linux已经提供有个系统环境变量了,直接就是随机数,哈哈,觉得刚学习方法,是不是白费了!!

1 [chengmo@centos5 shell]$ echo $RANDOM

2 10918

3 [chengmo@centos5 shell]$ echo $RANDOM

4 10001

5

6 #连续2次访问,结果不一样,这个数据是一个小于或等于5位的整数 可能有疑问了,如果超过5位的随机数怎么得到呢?

呵呵,加个固定10位整数,然后进行求余,跟例1 一样了。接下来的例子又是我们自立更生做了。

3、通过系统内部唯一数据生成随机数(/dev/random,urandom)

我们知道dev目录下面,是linux一些默认设备,它给我们感觉就是放的是键盘,硬盘,光驱等设备的对应文件了。 其实linux有些设备很特殊,有特殊用途。前面我们说到的:/dev/[udp|tcp]/host/port比较特殊吧。呵呵,有扯远了。

/dev/random设备,存储着系统当前运行的环境的实时数据。它可以看作是系统某个时候,唯一值数据,因此可以用作随机数元数据。我们可以通 过文件读取方式,读得里面数据。/dev/urandom这个设备数据与random里面一样。只是,它是非阻塞的随机数发生器,读取操作不会产生阻塞。

实例:

[chengmo@centos5 shell]$ head -1 /dev/urandom

???ù??KTt?anV??1?&???“?2íùU“ ?F|_ ?”?mEe?Urá?=JˉT?A?ìAúRtó 1 2 #读一行,怎么是乱码呢?其实它是通过二进制数据保存实时数据的,那么我们3 怎么样把它变成整型数据呢? 4 5 6 [chengmo@centos5 ~/shell]$ head -200 /dev/urandom | cksum 7 1615228479 50333 8 #由于urandom的数据是非常多,不能直接通过cat读取,这里取前200行,其9 实整个数据都是变化的,取多少也一样是唯一的。 10 #cksum 将读取文件内容,生成唯一的表示整型数据,只有文件内容不变,生成11 结果就不会变化,与php crc函数 12 13 [chengmo@centos5 shell]$ head -200 /dev/urandom | cksum | cut -f1 -d" " 14 484750180

#cut 以” “分割,然后得到分割的第一个字段数据

得到整型数据,然后,类似一的方法就可以获得到随机数了。 题外话:在程序里面,我们经常md5得到唯一值,然后是字符串的,如果想表示成整型方式,可以通过crc函数.crc是循环冗余校验,相同数据通过运算, 都会得到一串整型数据。现在这种验证应用很广。详细要了解,可以参考:crc.

下面还有个方法,直接从设备读取生成好的uuid码。

4、读取linux 的uuid码

在提到这个之前,有个概念,就是什么是uuid呢?

UUID码全称是通用唯一识别码 (Universally Unique Identifier, UUID),它 是一个软件建构的标准,亦为自由软件基金会 (Open Software Foundation, OSF) 的组织在分布式计算环境 (Distributed Computing Environment, DCE) 领域的一部份。 UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识信息,而不需要通过中央控制端来做辨识信息的指定。如此一来,每个人都可以创建不与其它人冲突的 UUID。在这样的情况下,就不需考虑数据库创建时的名称重复问题。它会让网络任何一台计算机所生成的uuid码,都是互联网整个服务器网络中唯一的。它 的原信息会加入硬件,时间,机器当前运行信息等等。

UUID格式是:包含32个16进位数字,以“-”连接号分为五段,形式为8-4-4-4-12的32个字符。范例;550e8400-e29b- 41d4-a716-446655440000 ,所以:UUID理

论上的总数为216 x 8=2128,约等于3.4 x 1038。 也就是说若每奈秒产生1兆个UUID,要花100亿年才会将所有UUID用完。

其实,大家做数据库设计时候,肯定听说过,guid(全局唯一标识符)码,它其实是与uuid类似,由微软支持。 这里编码,基本有操作系统内核产生。大家记得把,在windows里面,无论数据库,还是其它软件,很容易得到这个uuid编码。 linux 的uuid码

linux的uuid码也是有内核提供的,在/proc/sys/kernel/random/uuid这个文件内。其实,random目录,里面还有很多其它文件,都与生成uuid有关系的。

[chengmo@centos5 ~/shell]$ cat /proc/sys/kernel/random/uuid 1 dff68213-b700-4947-87b1-d9e640334196 2 [chengmo@centos5 ~/shell]$ cat /proc/sys/kernel/random/uuid 3 7b57209a-d285-4fd0-88b4-9d3162d2e1bc 4 #连续2次读取,得到的uuid是不同的 5 6 [chengmo@centos5 ~/shell]$ cat /proc/sys/kernel/random/uuid| cksum | 7 cut -f1 -d" " 8 2141807556 9 #同上方法得到随机整数

这是linux下面,几种常见活动随机数整数方法,除了第一个是不同外,其实后3个,产生随机码的伪数据来源,都与/dev/random设备有关系。只是它们各自呈现不同而已。

篇二:System返回值

system函数返回值探究 (2011-12-24 13:41)

标签: system函数 linux 分类: Linux

对于system这个函数的功能早就有一定了解,读书期间,就学习了UNIX系统编程这本书,后来买了APUE.我这个人总是有好读书不求甚解的毛病。对于system函数只知其一,不知其二。后来被人问起相关的问题,结果丢了脸。书到用时方恨自己不求甚解。今天仔细探查了下system的一些特性。

APUE这本书,对system这个函数已经将的比较明白了,只是它的相关知识稍显分散。最开始我是去网上找的资料,自己写的测试代码,可是还是有很多迷惑的地方。后来才拿起APUE ,好好读了第八章和第十章的相关章节。

?

?

? #include <stdlib.h> int system(const char *command); system的作用是在shell终端执行command。简单的说就是在C中执行system("ls")这行代码的含义就相当于在shell执行ls一样。这么说还是比较笼统,下面详细描述之:

system是个综合的操作,分解开来看就是相当于执行了

1 fork 生成一个子进程。

2 在子进程执行 execl("/bin/sh","sh","-c" command,(char*)0); 3 waitpid

下面进入正题,返回值:

1 如果fork失败了,或者waitpid返回除了EINTR之外的错误,system返回 -1; 2 execl执行失败,其返回值如同shell执行了"exit(127)" 一样。

3 如果上述三步都执行成功,那么,system返回值是shell的终止状态。

上面这些话是APUE的,很抽象,很不具体,很笼统,我现在结合手册和代码解释一下。

手册中有这么一段话:

? The value returned is -1 on error (e.g. fork(2) failed), and the return status of the command otherwise. This latter return status is in the format specified

in wait(2). Thus,the exit code of the command will be WEXITSTATUS(status). In case /bin/sh could not be executed, the exit status will be that of a command that does ? exit(127). 1 如果/bin/sh拉起shell命令失败,或者是shell命令没有正常执行 (比如命令根本就是非法的命令),那么,将原因填入status的8~15位。

手册中也说如果命令执行不起来,那么相当于执行exit

?

?

?

? libin@libin:~/program/C/Linux/system$ ./tsys "nosuchcmd" sh: nosuchcmd: not found status = 32512 normal termination,exit status = 127 我们看到了,nosuchcmd不是shell支持的命令,所以,shell命令返回了127,对于system函数,返回值为127*256 = 32512;因为shell的返回值是 system返回值的8~15位。

2 如果shell顺利执行完毕,那么将shell的返回值填到system返回值的8~15位。

这里需要强调以下,所谓顺利执行完毕,并不是说,命令command执行成功,而是指 /bin/sh顺利调用,执行期间没有被信号异常终止,这都算是顺利执行完毕。

看下面的例子:

?

?

?

?

?

?

?

?

? libin@libin:~/program/C/Linux/system$ ./tsys "ls /noexisted" ls: 无法访问/noexisted: 没有那个文件或目录 status = 512 normal termination,exit status = 2 libin@libin:~/program/C/Linux/system$ ls /noexist ls: 无法访问/noexist: 没有那个文件或目录 libin@libin:~/program/C/Linux/system$ echo $?

?? 2

?? libin@libin:~/program/C/Linux/system$

我们看到了,虽然/noexist文件并不存在,ls这条命令执行出了错,但是仍然属于shell顺利执行完毕。ls /noexist的错误吗是2,所以,system函数的返回值为 2*256 = 512.

各位可能比较感兴趣的是,如果我知道system的返回值,如何知道我的命令的返回值呢?手册中有这么一句话:

?? Thus, the exit code of the command will be WEXITSTATUS(status) 看到了WEXITSTATUS(status),就是command的返回值。当然前提条件是shell命令顺利执行完毕。即:

?? WIFEXITED(status) ! =0

3 前面的讨论都没有考虑信号,如果shell在执行过程中收到了信号。

这个问题我存在有疑惑,因为APUE第十章讲到,system的实现要忽略SIGINT和SIGQUIT,但是我的实验结果并不是这样,如有高手知道,请不吝赐教。

首先看我的终端信号配置:

?? libin@libin:~/program/C/Linux/system$ stty -a

?? speed 38400 baud; rows 36; columns 134; line = 0;

?? intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = M-^?; eol2 = M-^?; swtch = M-^?; start = ^Q; stop = ^S; susp = ^Z;

?? rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;

?? -parenb -parodd cs8 hupcl -cstopb cread -clocal -crtscts

?? -ignbrk brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc ixany imaxbel iutf8

?? opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0

?? isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

Ctrl+C产生SIGINT,Ctrl+\ 产生 SIGQUIT。

看下测试结果:

??

?? libin@libin:~/program/C/Linux/system$ ./tsys "sleep 7"

?? ^Cstatus = 2

?? abnormal termination,signal number =2

?? libin@libin:~/program/C/Linux/system$ sleep 7

?? ^C

?? libin@libin:~/program/C/Linux/system$ echo $?

?? 130 我们可以看到,直接在终端执行sleep 7,然后用Ctrl+C发送SIGINT信号,异常退出,shell返回值为130,130的原因,APUE上解释了,因为SIGINT 等于2,终止状态是128+信号编号,所以为130.

按照APUE上,我们的system调用应该将SIGINT忽略掉,然后正常返回,

同时返回值为130,但是实际上LINUX下并不是这样的。实际上system的返回值为2,并且异常退出了。

SIGQUIT信号也是一样的,看我在我的Ubuntu 上做的测试:

?? libin@libin:~/program/C/Linux/system$ ./tsys "sleep 7"

?? ^\status = 3

?? abnormal termination,signal number =3

?? libin@libin:~/program/C/Linux/system$ sleep 7

?

shell接收函数返回值

? ^\退出

?? libin@libin:~/program/C/Linux/system$ echo $?

?? 131

2012年1月1日,我做了下面的实验测试,下面是实验的过程。

?? root@libin:~/program/C/Linux/system# ./tsys "sleep 50" &

?? [1] 2518

?? root@libin:~/program/C/Linux/system# ps -ef

??

??

?? root 2359 2343 0 12:42 pts/0 00:00:00 /bin/bash

?? root 2518 2359 0 12:55 pts/0 00:00:00 ./tsys sleep 50

?? root 2519 2518 0 12:55 pts/0 00:00:00 sh -c sleep 50

?? root 2520 2519 0 12:55 pts/0 00:00:00 sleep 50

?? root 2521 2359 0 12:56 pts/0 00:00:00 ps -ef

?? root@libin:~/program/C/Linux/system# kill -3 2520

?? Quit

?? status = 33536

?? normal termination,exit status = 131

??

??

?? root@libin:~/program/C/Linux/system# ./tsys "sleep 50" &

?? [1] 2568

?? root@libin:~/program/C/Linux/system# ps -ef

??

?? root 2568 2359 0 13:01 pts/0 00:00:00 ./tsys sleep 50

?? root 2569 2568 0 13:01 pts/0 00:00:00 sh -c sleep 50

?? root 2570 2569 0 13:01 pts/0 00:00:00 sleep 50

?? root 2571 2359 0 13:01 pts/0 00:00:00 ps -ef

?? root@libin:~/program/C/Linux/system# kill -3 2569

?? status = 3

?? abnormal termination,signal number =3

Tsys ----> /bin/sh ----->sleep 50

从测试结果上看,基本上进程关系如下,system的返回值,其实是shell的终止状态,

而不是sleep的返回值。所谓屏蔽INTR信号和QUIT信号,指的是tsys这个进程,忽略了INT信号的QUIT信号,但是sh进程,和sleep进程,都没有忽略这两个信号。

如果给sleep进程发送SIGQUIT信号,杀死sleep进程,那么sleep会返回131,告诉shell进程我被SIGQUIT杀死了。而sh进程,则是安然退出,所以,依然打印出正常退出的打印,通过调用WEXITSTATUS,看以看出,sleep进程的遗言是131,表明收到QUIT信号。

下面是测试程序,基本是照抄的APUE。

?

?

?

?

?

?

?

?

? #define _XOPEN_SOURCE #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<signal.h> #include<sys/wait.h>

?? void pr_exit(int status)

?? {

??printf("status = %d\n",status);

?? if(WIFEXITED(status))

??{

?? printf("normal termination,exit status = %d\n",WEXITSTATUS(status)); ??}

??

??else if(WIFSIGNALED(status))

篇三:实验一 UNIX 实现带参数的简单shell

实验一 实现带参数的简单shell

一.实验要求

利用课本第9页程序1-5的框架,实现带参数的简单shell,实现允许输入命令带参数的简单shell。

(1)正确理解并使用系统调用fork(),execve()和waitpid(),特别是execve()函数。fork()函数创建一个新的进程。新进程就是所谓的子进程,它是执行fork()函数的进程(父进程)的“克隆”,也就是说,子进程执行的程序与父进程的完全一样。当fork()函数返回值为0时表示处于子进程中;而返回值大于0时表示处于父进程中,此时的返回值是子进程的进程id。因此,fork()的返回值可以用来划分仅仅适合父进程和子进程执行的程序段。fork()函数返回值为-1时表示出错。如果子进程只是运行与父进程完全一样的程序,那用处是很有限的。要让子进程运行不同于父进程的程序,就必须调用execve函数,它是所有其他exec函数的基础。execve函数把调用它的进程的程序,替换成execve函数的参数所指定的程序。运行execve函数成功后,进程将开始运行新的程序,也就是execve函数的参数所指定的程序。

execve函数原型:int execve(const char *path, const char*argv[],const char *envp[]); 其中:

path:要执行的程序路径名,比如“/bin/ls”,“cd”,“/usr/bin/gcc”等等。

argv:参数表,比如ls命令中可带的命令行参数-l,-a等。注意,argv的第一个元素必须是要执行的程序(命令)的路径名。

envp:环境变量表,供要执行的命令使用。实参数用NULL或系统环境变量environ均可。注意,因为environ由系统提供,属于外部变量,所以说明时必须用“extern”修饰。 例子:

char *argv[] ={“gcc”, “-g”, “-c”, “hello.c”, NULL};

char *argv1[] = {“/bin/ls”,“-l”, “-a”, NULL};

execve(“/usr/bin/gcc”,argv, environ); // 编译程序“hello.c”

execve(“/bin/ls”,argv1, NULL); // 执行命令“ls –l –a”

execve(“/usr/ls”, argv1, NULL); // 出错,因为目录/usr/下没有ls程序。

// 注意,在argv1 的第一个字符串“/bin/ls”中,只有ls是有用的。

系统调用waitpid()用于等待子进程结束、获取子进程的运行状态,详细说明在第八章。本实验仅仅用它使父进程等待子进程结束,因此维持程序1-5的用法即可。

(2)根据简单shell的输入,构造execve函数的参数。

根据程序1-5,数组buf保存用户的输入,包括命令和参数。由于shell命令的命令名和各参数之间是用空格分开,因此可以用空格作为分界符。通过一个循环可以把buf数组中的命令和各个参数依次分离开来,并赋给数组argv的各元素适当的指针值。argv数组的最后一个指针必须是NULL。接着就可以调用execve(argv[0],argv, environ)来执行用户输入的命令。 提示:argv数组中各指针所指向的字符串,可以直接利用buf的存储空间,不需要另外分配内存。

二.设计和实现的主要原理、构思、算法

#include "apue.h"

#include <sys/wait.h>

#include <unistd.h>

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define MAXLINE 80

int main()

{

char buf[MAXLINE]; //输入行的缓存

pid_t pid;

char *envp[]={NULL};

char *argv[]={NULL};//存储命令的数组指针

char str[1024][256];//二维数组用来分离输入行命令和参数

char path[256];//存储路径的数组

int i,j,k,status;

while(fgets(buf,MAXLINE,stdin)!=NULL)

{

memset(path,0,sizeof(path));//路径数组初始化

if(buf[strlen(buf)-1]=='\n')

buf[strlen(buf)-1]=0;

j=i=k=0;

while(buf[j]!='\0')//判断输入行是否结束

{

if(buf[j]!=’ ’) //判断当前命令或参数是否结束,进入下一个

{

for(i=j;buf[i]!=' '&&buf[i]!='\0’;i++)

{

str[k][i-j]=buf[i];//将一个完整的命令或参数放入一个行不变的二维数组中

}

str[k][i-j]='\0';//存储完一个完整的命令或参数时,加上’\0’来表示结束

k++;

j=i;

}

else

{j++;}

}

for(i=0;i<k;i++)

{

argv[i]=str[i];//将分离出来的命令或参数按顺序一一传递给argv[]数组

}

argv[k]=NULL; strcat(path,argv[0]);//

确定argv[]数组第一个存储是路径

if((pid=fork())<0)

{

printf("fork error");

}

else if(pid==0)

{

execve(path,argv,envp);

printf("couldn't execute:%s\n",argv[0]);

exit(127);

}

if((pid=waitpid(pid,&status,0))<0)

printf("waitpid error");

}

exit(0);

}

三.实验结果

源程序名: one.c

可执行程序名:one

编译方法:gcc one.c error.c –o one

结束方法:ctrl+\

运行示例:(1)./one

/bin/ls -l

(2)输入:pwd和man mkdir (提示错误,没有输入路径)

/bin/pwd 和 /usr/bin/man mkdir (正确,说明有路径,输入的不管有参数和没参数的命令都能正常)

(3)输入:ctrl+\ 结束执行

四、总结

a.fgets(由文件中读取一字符串,也可以从屏幕上输入一字符串。)

表头文件:#include<stdio.h>

定义函数:char * fgets(char * s,int size,FILE *stream);

s,数据存储位置;size,读取字符串的最大数量;stream,指向FILE结构的指针。函数说明:fgets()用来从参数stream所指的文件内读入字符并存到参数s所指的内存空间,直到出现换行字符、读到文件尾或是已读了size-1个字符为止,最后会加上NULL作为字符串结束。

返回值:fgets()若成功则返回s指针,返回NULL则表示有错误发生。

b.if(buf[strlen(buf)-1]=='\n')//输入不为换行

buf[strlen(buf)-1]=0;

因为fegts返回的每一行都是以换行符终止,后随一个null字节,故用strlen计算字符串的长度,然后用一个null字节替换换行符。这样做是因为execlp函数要求参数以null而不是以换行符结束。

c. execve(执行文件)

在父进程中fork一个子进程,在子进程中调用exec函数启动新的程序。exec函数一共有六个,其中execve为内核级系统调用,其他(execl,execle,execlp,execv,execvp)都是调用execve的库函数。

表头文件:#include<unistd.h>

定义函数:int execve(constchar * filename,char * const argv[ ],char * const envp[ ]); 函数说明:execve()用来执行参数filename字符串所代表的文件路径,第二个参数是利用数组指针来传递给执行文件,并且需要以空指针(NULL)结束,最后一个参数则为传递给执行文件的新环境变量数组。

返回值:如果执行成功则函数不会返回,执行失败则直接返回-1,失败原因存于errno中。

五、体会

通过这次实验, 我体会到了老师说的“一定要上机操作”的意义。刚开始看到题目,连怎么着手都不知道。不知道怎么建文件,不知道去哪里敲程序,整一个迷茫。后来和同组的同学决定先去网上找找看资料,然后真的找到了对应的程序。然后在其他同学的帮助下,学会了用vi编译,知道了写入、保存退出,并知道了敲入编译的命令。这是在当堂实验课的成果。然后编译没有通过,后来回到宿舍,再次开始查错改代码。这次,我通过错误的指示以及对错误原因的百度,自己为程序添加了#include<stdio.h>、#include<stdlib.h>、

#include<string.h>三个头文件,并添加了宏定义#define MAXLINE 80。然后把网上程序中的 err_sys和 err_ret改成了printf。终于编译通过了,也在这个过程中,我知道了one.c是一个源程序,而编译通过后会形成一个可执行程序,进一步理解了gcc one.c error.c -o one 的意思。可是在执行程序时,显示说“段错误”,这迫使我再次去更深入地理解程序源代码。在这个过程中, 我理解了fork()函数和execve()函数,对整个程序有了基本的理解。后来发现错误是“!=”写成了“=”,排除了这些错误后,程序终于可以成功执行了。

这次的程序大体是从网上载的,不过在纠错的过程中,我和同伴也对程序有了更深入的理解。同时通过这次试验,对UNIX中的基本命令有了大致的掌握。希望以后实验的代码,自己能够慢慢地越写越多。

完成者:洪晓珍 23020112204018

贾宇23020112204026

完成时间:2013年10月23日

标签:函数 返回值 接收 shell 函数返回值 shell函数返回值处理