1 什么是SHELL和SHELL脚本?
1.1 什么是shell:
shell其实是一个命令解释器,它的作用是解释用户输入的命令和程序,命令和程序可以理解成我们图中的应用程序,我们linux系统中的那些命令其实也都是一个个的小程序,只不过完成的是系统的应用功能。我们在系统的终端中输入一条命令,可以立马看到一条或者几条系统回复我们的信息,其实就是shell在帮我们回复,所以shell可以称之为命令解释器。这种从键盘一输入命令,就可以立马得到相应的回复信息,叫作交互的方式,相当于我们在和电脑交流。Shell存在于系统的最外层,所以算作操作系统的外壳,它之外的应用程序就不能算作操作系统了。我们从输入系统的账户密码开始,到登录系统以后的所有操作都是shell在帮我们解释执行的。
简单来说,shell也是操作系统中的一个软件,它包括在linux的外面,为用户和内核之间的交互提供了一个接口。系统中的命令用shell去解释,shell接收系统回应的输出并显示其到屏幕中。
bash=GNU Bourne-Again Shell
1.2 shell脚本:
如果我们的命令或者应用程序不在命令行直接执行,而是通过一个程序文件来执行时,这个程序就被称之为shell脚本。Shell脚本里面通常内置了多条命令,有的还包含控制语句,比如if和else的条件控制语句,for和select的循环控制语句等。这些内置在一个shell脚本中的命令通常是一次性执行完成,不会不停的返回信息给用户,这种通过文件执行脚本的方式称之为非交互方式。Shell脚本类似于windows下的批处理,但是它比批处理要强大一些,现在windows下有一个叫做power shell的功能可以和linux下的shell功能媲美。
总结来说,
我们可以在文本中输入一系列的命令、控制语句和变量,这一切有机的结合起来就形成了功能强大的shell脚本。
总结来说,脚本是一种解释性语言 (与它相对应还有描述型语言);用shell脚本保存执行动作;用脚本判定命令的执行条件;用脚本来实现动作的批量执行
2 SHELL脚本的规范与执行
2.1 shell脚本的规范:
一个完整的shell脚本需要有以下几个部分:
1.脚本名:最好以.sh结尾
2.第一行:#!/bin/bash
指定解释器:由哪个程序来执行脚本内容
#!:幻数
注意:#!/bin/bash必须写在第一行,否则会被认为是注释
3.有用户判断,否则任何用户都可以执行这个脚本
4.有流程控制,否则只是把简单的命令进行顺序操作,没有成功与否的判断
5.注释:可以命令后,也可以自成一行(方便自己也方便他人)
2.2 如何创建一个简单的shell脚本:
vim script.sh #用vim编写脚本
#!/bin/bash #脚本使用的解释器,通常用幻数“#!”指定,正规的shell脚本需要为脚本添加注释
#Author #脚本作者
#DATE #创作时间
#MAIL #脚本作者联系方式
#VERSION #脚本的版本
*如何让让vim自动加注释?
vim /etc/vimrc
"map <F9> ms:call WESTOS()<cr>'s "表示注释,改条语句表示使用f9快捷键添加注释。
若不想使用快捷键,直接打开新的以sh结尾文件自动添加,使用下面一条命令
autocmd BufNewFile *.sh exec ":call WESTOS()"
function WESTOS()
call append(0,"#############################")
call append(1,"# Author: #")
call append(2,"# Create_Time: ".strftime("%Y-%m-%d")." #")
call append(3,"# Version: #")
call append(4,"# Mail: #")
call append(5,"# Description: #")
call append(6,"# #")
call append(7,"# #")
call append(8,"#########################")
call append(9,"")
call append(10,"#!/bin/bash")
endfunction
2.3 shell脚本的执行:
方式一:
cd /mnt
chmod +x test.sh
./test1.sh
./的意思是说在当前的工作目录下执行test1.sh。如果不加上./,bash可能会响应找到不到test1.sh的错误信息。
方式二:
以绝对路径的方式去执行bash shell脚本:
/mnt/test1.sh
方式三:直接使用bash 或sh 来执行bash shell脚本:
cd /mnt/
bash test1.sh
或
cd /mnt/
sh test1.sh
方式四:在当前的shell环境中执行bash shell脚本:
cd /mnt/
. test1.sh
或
cd /mnt/
source test1.sh
前三种方法执行shell脚本时都是在当前shell(称为父shell)开启一个子shell环境,此shell脚本就在这个子shell环境中执行。
shell脚本执行完后子shell环境随即关闭,然后又回到父shell中。而方法四则是在当前shell中执行的。
例如:怎么在当前shell中显示a的值
a=1
vim test.sh
#!/bin/bash
echo $a
source test.sh = . test.sh source和.是在当前shell中执行的
2.4 shell脚本的调试:
脚本的调试:
sh -x script.sh 适用于所有shell脚本
vim script.sh shell脚本必须有x权限
#!/bin.bash -x
2.5 shell脚本的示例:
*)执行命令后可以清空日志
vim test.sh
#!/bin/bash
[ "$USER" = "root" ] || {
echo "Error:this is script must run as root!!"
}
Max_Line=`sed -n '$=' /etc/rsyslog.conf`
Target_Log=`grep RULES /etc/rsyslog.conf -A Max_Line | awk '!/^#/&&!/^$/{print $2}' | sed '/^:/d;s/-//g'`
for Log_file in $Target_Log
do
> $Log_file && {
echo $Log_File is cleared !!
}
done