shell脚本应用(一)

1.编制个人第一个shell脚本linux

shell脚本是什么我来简单的说一下,shell脚本是linux系统中的一个特殊程序,他工做在操做系统内核与应用之间,充当了一个"命令解释器"的角色,负责接收用户输入的操做指令并进行解释,将须要执行的操做传递给内核执行,并输出结果。shell

咱们来看看我本身的系统支持什么样的shell脚本种类vim

[root@dbserver ~]# cat /etc/shells bash

/bin/shoracle

/bin/bashapp

/sbin/nologinide

........下边的用不上
spa

这里,/bin/sh是linux版本采用的默认shell脚本,Bash的全称为Bourne Again Shell,是最受欢迎的开源项目。操作系统

其实Shell脚本就是将平时使用的各类Linux命令按顺序保存到一个文本文件,添加执行权限,这个文件就能够叫作shell脚本了。例:server


[root@dbserver script]# cat first.sh 

#!/bin/bash

cd /boot

pwd

ls -lh vml*


[root@dbserver script]# chmod +x first.sh 

[root@dbserver script]# ./first.sh 

/boot


-rwxr-xr-x. 1 root root 4.0M Nov 11  2013 vmlinuz-2.6.32-431.el6.x86_64

这里我执行了三条命令,cd /boot,pwd, ls -lh vml*,执行此脚本后发现没,和这三条命令输出的结果是同样的,这能够说是一个'批量处理'的自动化过程。

咱们编写脚本时要养成一个好习惯就是遵循标准的脚本结构,让脚本能输出友好的提示信息,更加容易读懂,对于代码较多,机构复杂的脚本,应当添加必要的注释文字,以下改写后的脚本:


[root@dbserver script]# cat first.sh 

#!/bin/bash

cd /boot

echo  "In the current directory:"       //当前的目录位于

pwd

echo  "Begin with VML files including:"  //其中以VML开头的文件包括

ls -lh vml*

[root@dbserver script]# ./first.sh 

In the current directory:

/boot

Begin with VML files including:

-rwxr-xr-x. 1 root root 4.0M Nov 11  2013 vmlinuz-2.6.32-431.el6.x86_64


是否是很直白明了,哈哈!

还有别的方法就是不用加执行权限就能直接执行,例如:

[root@dbserver script]# sh first.sh  //经过/bin/sh来解释脚本

[root@dbserver script]# . first.sh    //经过点号来加载脚本

Linux系统中包括大量的Shell脚本文件,如/etc/init.d目录下的各类服务控制脚本这些Shell脚本只能用来参考,尽可能避免直接修改系统脚本,以避免致使服务或系统故障

2.重定向与管道操做

1).重定向操做:用户经过操做系统处理信息的过程当中,包括如下几类交互设备文件:

标准输入(STDIN):默认设备是你的键盘,文件编号为0,命令将从标准输入文件中读取在执行过程当中须要的输入数据。

标准输出(STDOUT):默认设备是你的显示器,文件编号为1,命令将执行后的输出结果发送到标准输出文件。

标准错误(STDERR):默认设备是你的显示器,文件编号为2,命令将执行期间得各类错误信息发送到标准错误文件。

关联起来讲就是标准输入输出和标准错误默认使用键盘和显示器做为关联的设备,与操做系统进行交互,完成最基本的输入、输出操做。这句话理解起来就是你经过键盘输入的各类命令字串,辅助控制信息,将命令输出到屏幕上,命令执行错误,错误信息也会反馈到屏幕上。在实际的Linux系统维护中,能够改变输入输出的内容方向,而不使用默认的标注输入输出设备(这里指键盘和显示器),这种操做就叫作重定向。

重定向输出:使用">"或">>"操做符号,分别用于覆盖或追加文件,例:


[root@dbserver ~]# uname -p > kernel.txt         //输出结果会覆盖到此文件中

[root@dbserver ~]# cat kernel.txt 

x86_64                              //CPU类型信息

[root@dbserver ~]# uname -r >> kernel.txt  //输出结果会追加进去而不是覆盖

[root@dbserver ~]# cat kernel.txt   

x86_64

2.6.32-431.el6.x86_64            //CPU内核版本信息


重定向输入:将命令中接收输入的途径由默认的键盘改成指定的文件,例如:


[root@dbserver ~]# vim pass.txt   //在文本中添加初始密码为"123456"

123456

:wq

[root@dbserver ~]# passwd  --stdin root < pass.txt    //从pass.txt文件中取密码

Changing password for user root.

passwd: all authentication tokens updated successfully.  //成功了


错误重定向:是执行命令过程当中出现的错误信息(选项过参数错误)保存到制定的文件中去,而不是直接显示到屏幕上,错误重定向使用'2>'操做符,其中'2'是指错误文件的编号(在使用标准输入输出重定向时省略了1,0编号),在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据,对于shell脚本,还能够把可有可无的错误信息重定向到空文件中,以保持输出脚本的整洁,例:

[root@dbserver ~]# tar jcf /nonedir/etc.tgz  /etc/ 2> error.log 

[root@dbserver ~]# cat error.log 

tar: Removing leading `/' from member names

tar (child): /nonedir/etc.tgz: Cannot open: No such file or directory

tar (child): Error is not recoverable: exiting now

使用'2>'操做符时,会像使用'>'操做符同样覆盖目标文件的内容,若要追加内容可使用’2>>'操做符

,有时候你须要编译Apache这些包,你能够把make、make install 这些操做信息定向到空件/dev/null中。省去这些信息。

3.管道操做:

管道操做做为不一样命令之间的协同工做提供了一种机制,位于管道"|"左侧的命令输出结果,将做为右侧命令的输入(处理对象),对于同一行命令可使用多个管道,在shell脚本应用中,管道操做一般用来过滤所须要的关键信息。例:


[root@dbserver ~]# grep "/bin/bash$" /etc/passwd

root:x:0:0:root:/root:/bin/bash

oracle:x:500:500::/home/oracle:/bin/bash

zhangsan:x:501:502::/home/zhangsan:/bin/bash

lisi:x:502:503::/home/lisi:/bin/bash

wangmazi:x:503:504::/home/wangmazi:/bin/bash

[root@dbserver ~]# grep "/bin/bash$" /etc/passwd | awk -F: '{print $1,$7}'

root /bin/bash

oracle /bin/bash

zhangsan /bin/bash

lisi /bin/bash

wangmazi /bin/bash

上述例子中awk命令的做用是以冒号":"做为分隔,输出第一个和第七个区域的字符串,其中的"-F"部分用来指定分隔符号,未指定时默认为空格,关于他的用法请大家多查查资料,这个用的不少的,再举个例子,下面例子中过滤的是/目录的使用率为多少:


[root@dbserver ~]# df -hT 

Filesystem               Type    Size   Used    Avail  Use%   Mounted on

/dev/mapper/vg_rhel1-lv_root   ext4    45G    15G     29G   34%       /

tmpfs                 tmpfs    936M   72K     936M     1%    /dev/shm

/dev/sda1               ext4    485M    39M    421M    9%     /boot

[root@dbserver ~]# df -hT |grep "/$" |awk    '{print $6}'

34%


今天先写到这把,明天把shell变量怎么用再给大家写写,这东西还有不少,敬请看我更新,咋们从最基础的作起!!