Lee出品,转载请注明出处 http://blog.csdn.net/hnulwt/article/details/43234977
继续上次学的内容,这次学习 case 语句和 shell的函数概念。
case 语句
首先先看看测试程序:
1 #! /bin/sh 2 3 animal=dog 4 5 case "$animal" in 6 cat) 7 echo "cat";; 8 dog) 9 echo "dog";; 10 lion) 11 echo "lion";; 12 esac
上面程序运行结果很简单,输出:dog
他的结构是:
case "变量名" in
字符串一)
执行语句一;;
字符串二)
执行语句二;;
esac
需要特别注意的几点是:
1,case 后面的变量名要用引号括起来(上面例子程序中的第5行)
2,匹配条件,字符串前面没有括号,后面有括号 (上面程序中的6、8、10行)
3,执行语句结束位置要有双分号; (上面程序中的7、9、11行)
4,结尾要有倒置的case匹配,即esac
函数
首先我们看一个最简单的函数,下面是一段程序:
1 #! /bin/sh 2 3 sayDog() 4 { 5 echo "dog" 6 return $? 7 } 8 9 sayDog
程序很简单,3-7行我们定义了sayDog函数。第六行其实也可以忽略,$? 在之前章节讲过是函数的返回值,在第9行我们调用了这个函数。
来看看程序的运行结果:
$ sh test.sh
dog
参数
如何给函数里面传入参数呢,shell不像我们写的java 、c++程序在括号里面传参数,传参数只需要直接在函数里面使用$n 既可(n代表传入的第几个参数)
看下面这一段程序:
1 #! /bin/sh 2 3 sayAnimals() 4 { 5 echo $1 6 echo $2 7 } 8 9 sayAnimals cat dog
在上面函数的第5、6行,使用了传入的参数1、参数2。第9行调用函数,并且传入cat dog俩个参数,我们来看看执行结果:
$ sh test.sh
cat
dog
看到了吧?shell传入参数其实非常简单。
返回值
shell的返回值和我们理解的一般的程序返回值是不一样的,shell 函数返回值只能是整形数值,一般是用来表示函数执行成功与否的,0表示成功,其他值则表示失败。因而用函数返回值来返回函数执行结果是不合适的。如果return一个字符串,则会得到错误提示:“numeric argument required”
程序是死的,人是活的嘛,这样不行,我们可以通过定义全局变量,函数将计算结果赋给全局变量,然后脚本中其他地方访问这个全局变量,就可以达到我们的目的啦。
输入、输出重定向
使用过ant 等工具的人可能对这个概念已经不陌生了。
每个 Unix/Linux 命令运行时都会打开三个文件:
标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
shell的重定向用于将标准输出或标准错误输出重定向到其他位置。
标准输入,标准输出,标准错误输出是什么呢?我们可以理解为:键盘是标准输入,显示器是标准输出,错误输出默认仍然是显示器。
而重定向就是将本来要输出在显示器上的东西,定向到其他位置了,比如文件中。
输出重定向的语法为:指令 > 文件名
我们举个例子,我们在终端执行命令 ls > test,这时候我们在屏幕上看不到输出,本来ls就是现实当前目录下的文件,这时候我们已经把这些输出重定向到一个叫test的文件中了。我们通过vim test打开,可以看到结果。确实结果输出到test文件中了。这里不再图示,自己执行命令即可。
输出重定向还有一个格式:指令 >> 文件名
这个格式会保证 若已存在文件,则结果追加到输出到文件末尾,即不会覆盖。
输入重定向的语法:指令 < 文件名
例子:比如我们有一个文件test.txt,里面有3行内容。我们要统计他的行数,可以通过执行命令:wc -l < test.txt来统计
结果输出:3
好了,通过四节的内容,我们已经掌握shell的基本使用方式,可以写出一些简单的shell程序,但是距离真正编码还是有一段差距的,所以我们还要继续努力!多练习,多看别人写的shell程序,达到学习,提升自己的目的。