文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>程序返回值在 shell 编程中的应用

程序返回值在 shell 编程中的应用

时间:2007-07-31  来源:dorainm

今天终于在凑巧的情况下,知道了 linux 下shell 的返回值

大家知道我们编写一个程序,不可能就一个 main 函数,

当 main 函数调用子函数的时候,可以设置一个子函数的返回值
比如

...
int openfile( char *filename )
{
        FILE *fp;
        if( (fp=fopen(filename,"r")==NULL )
                return 1;
        fclose(fp);
        return 0;
};
...


我们用 main 函数调用的时候,可以根据返回值,来判断自函数的运行情况,来决断程序的运行

int main( void )
{
        int ret;
        ret = openfile( "dorainm.txt" );
        if( ret==0 )
        {
                ... 做该做的事情 ...
        }
        else
        {
                ... 说明文件无法读,抱错,退出程序 ...
                return 1;
        }
        return 0
};


例子中,通过对子函数的返回值判断,可以让程序做能阅读文件时候做的事情和无法阅读的时候的错误

这样子,程序就不是想象中的线性执行下来了

(不然,上面都无法打开文件了,下面还说要读取里面东西)

一个程序内,可以通过 子函数返回值,来控制程序的流程

但是,大家看上面文章,func返回值给 main 函数,

那么 main 函数的返回值乜?

其实,这是 shell 编程或者 批处理编程 里面非常好用的一点

因为批处理就是调用一个一个可执行程序的 main 函数 :)

如果我们写个 shell 或者 批处理,把某某文件复制到当前目录上来
然后进行添加一句话

如果文件复制失败了,那么后面添加还有什么意思吗??

批处理给人的概念,就是一堆任务,一条一条的 DOS 指令依次运行而已

其实不然,它也可以做流控制,它可以收集 copy程序的 main 函数返回值来判断下一步运行

@echo off
rem @表示当前语句不显示
rem echo off 屏蔽所有显示信息,将命令响应关上
rem copy


先看看当前文件下的内容

D:\tools\returnvalue>dir
驱动器 D 中的卷是 data
卷的序列号是 186F-FE13

D:\tools\returnvalue 的目录

2006-06-28 23:08 <DIR> .
2006-06-28 23:08 <DIR> ..
2006-06-28 23:08 17 1.txt
2006-06-28 23:07 580 test.bat
               2 个文件 597 字节
               2 个目录 1,001,398,272 可用字节

D:\tools\returnvalue>type 1.txt
hello, dorainm

D:\tools\returnvalue>


有个 1.txt, 内容是 hello, dorainm

显示语法

D:\tools\returnvalue>test
Usage : test filename
D:\tools\returnvalue>


运行

D:\tools\returnvalue>test 1.txt
copy done
add finished

D:\tools\returnvalue>more temp.txt
hello, dorainm
I found it

D:\tools\returnvalue>


显示复制成功,添加完成,
用 more 察看 temp.txt 里面的内容,的确添加了一行 i found it

运行如果输入参数是不存在的文件,看看效果

D:\tools\returnvalue>test 2.txt
copy error

D:\tools\returnvalue>


这个批处理完成了 通过判断 copy 的 main 函数的返回值来决定 批处理程序的流程

Linux 下的 shell 程序, 同样可以利用 $? 来判断上一次 的 command 的 main 返回值
实现同样效果的 linux shell

#!/bin/bash


if [ $# -ne 1 ]

then
        echo "usage : $0 filename"
        exit 1
fi

cp $1 ./temp.txt > /dev/null 2>&1
if [ $? -eq 0 ]
then
        echo "copy done"
else
        echo "copy error"
        exit 2
fi

echo "i found it" >> ./temp.txt
echo "add finished"
exit 0


察看当前目录下的文件

[dorainm@dorm shell]$ ls
1.txt test.sh
[dorainm@dorm shell]$ more 1.txt
hello, dorainm
[dorainm@dorm shell]$


运行语法

[dorainm@dorm shell]$ ./test.sh
usage : ./test.sh filename
[dorainm@dorm shell]$


正确参数运行

[dorainm@dorm shell]$ ./test.sh 1.txt
copy done
add finished
[dorainm@dorm shell]$ more temp.txt
hello, dorainm
i found it
[dorainm@dorm shell]$


失败参数

[dorainm@dorm shell]$ ./test.sh 2.txt
copy error
[dorainm@dorm shell]$


通过以上例子, 我们懂得, main 函数的返回值其实是有价值的

它通过传递给 shell中的 $? 或 cmd 中的 %errorlevel% ,

让原先的线性执行程序的 shell 或者 批处理,

实现了程序的流程控制!!

这样子, 我们的批处理或者 shell 程序

就能够实现想程序一样智能
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载