您的位置:首页 > 运维架构 > Shell

快速入门shell脚本编写(四)

2017-07-21 09:04 453 查看
继续上次学的内容,这次学习 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程序,达到学习,提升自己的目的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: