1.编制我的第一个shell脚本

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

我们来看看我自己的系统支持什么样的shell脚本种类

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

/bin/sh

/bin/bash

/sbin/nologin

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

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

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


[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变量怎么用再给你们写写,这东西还有很多,敬请看我更新,咋们从最基础的做起!!