shell是一个命令解释器它在操作系统的最外层负责直接与用户对话把用户的输入解释给操作系统并处理各种各样的操作系统的输入结果输出到屏幕返回给用户,这种对话可以是交互是的(从键盘输入命令可以立即得到shell的回应)或非交互(脚本的方式)。
下图中×××的部分就是shell处于操作系统的位置。
当linux命令或语句不在命令行下执行(严格的说命令行执行的语句也是shell脚本),而是通过一个程序文件执行时改程序就被成为shell脚本或shell程序,shell程序很类似DOS系统下的批处理程序(扩展名 *.bat)严格的说命令行下执行的语句也是shell 如for循环。
范例1.清除/var/log下的messages日志文件的简单命令脚本
把所有命令放在一个文件里堆积起来就形成了脚本,下面是最简单的命令堆积起来的脚本,清空日志脚本。
Cd /var/log
Cat /dev/null > messages
Echo “Logs cleaned up.”
拓展:清空日志及文件内容的三种方法
[root@localhost ~]# echo >test.log
[root@localhost ~]# >test.log
[root@localhost ~]# cat /dev/null >test.log
应用场景:保留文件,清空内容。
Shell脚本语言的种类
在UNIX和LINUX中主要有两大类
(1)Bourne shell 包括(sh、ksh和 bash)
Bourne shell (sh)
Kor n shell (ksh)
Bourne Again shell(bash)
POSIX shell (sh)
(2)C shell 包括(csh和tcsh)
C shell (csh)
TENEC/TOPS C shell (tcsh)
Shell脚本是弱类型语言目前最常用的shell有标准的Bourne shell(sh)和C shell(csh).其中Bourne shell(sh)已经被bash shell取代。但是我们还是习惯称之为sh。
在linux中可以在/etc/init.d/shells下查看系统支持的shell,前三个是比较常用的,最常用的是/bin/sh,在工作中执行脚本用/bin/sh搞不定的我们可以用第一个。/sbin/nologin表示登录。
Shell的优势在于处理操作系统底层的业务,因为有大量的系统命令做支撑。Python,php的优势在于开发运维工具,web界面的管理工具以及web业务的开发等。
Linux是Bourne Again shell(bash)?查看方法echo $SHELL
Salaris和Free BSD 缺省的是Bourne shell(sh)
AIX下是korn shell(ksh)
HP-UX缺省的是POSIX Shell(sh)
shell脚本通常在shell编辑器中完成推荐使用vim编辑器,脚本第一行会指出由哪个程序(解释器)来执行脚本中的内容,通常会用#!/bin/bash或#!/bin/sh,如果不写第一行就会用系统默认的shell解释。
用ls –l /bin/sh查看会发现sh为bash的软连接
推荐使用标准的写法#!/bin/bash, bash –version查看shell版本
漏洞是控制Linux计算机命令提示符的软件中存在的漏洞。
bash是一个为GNU计划编写的Unix shell。它的名字是一系列缩写:Bourne-Again SHell ,Bourne shell是一个早期的重要shell,由史蒂夫·伯恩在1978年前后编写,并同Version 7 Unix一起发布。
网络安全专家警告称,开源软件Linux中一个频繁使用的片段“Bash”,发现存在安全漏洞,其对计算机用户造成的威胁可能要超过2014年4月爆出的“心脏出血”(Heartbleed)漏洞。以上来自官方,大家可以在百度搜索“破壳漏洞”查看,下面为查看地址.
当shell脚本以非交互的方式(文件方式)运行时会先找到环境变量ENV,该变量指定了一个环境文件(.bashrc bash_profile /etc/bashrc /etc/profile)然后从该环境变量开始执行,再执行shell脚本的内容。
系统环境变量不需要定义,但是用crond定时任务时要把系统环境变量在脚本中重新定义,因为crond能识别的系统环境变量很少。
可以在/etc/profile系统环境变量中定义变量,添加后就可以直接在脚本中引用了。例如在/etc/profile最下面添加export NAME=zhangsan,注意这里的name要大写。添加完了我们用source重启一下脚本使修改成效,不必重启系统。
所以有时候要定义的东西在所有脚本里面都要用到就可以在/etc/profile中定义。
(1) bash.script-name 和 sh.script-name (推荐使用)在执行定时任务时都要带shell全路径。
(2) path/script-name全路径加脚本或./script-name(当前路径下执行脚本)用第二种必须的有执行权限。
(3) source script-name或./script-name(注意“.”点号)
source 或 “.”点号加载执行过的脚本,在脚本结束后脚本中的变量(包括函数)值,在当前shell中依然存在而sh和bash则不行。因此在做shell脚本开发时,如果脚本中有需求引用其他脚本中的内容或者配置文件是最好用“.”点号或source在脚本开头加载该脚本或配置文件然后下面的内容就可以调用source加载的脚本及文件中的变量及函数等内容。
例如:用sh执行脚本,如下图。
这里echo $user 输出的内容为空,因为用sh调用脚本user变量没有保存下来。
下面我们再以source为例,如下图
我们也可以在脚本中引用source 和“.”号
一些服务在/etc/init.d/下在调用系统函数库的时候也都用的“.”点号和source,我们查看一下系统函数库/etc/init.d/functions如下图
还可以用source调用函数库,action打印出很炫的结果,如下图
上图中的action是在/etc/init.d/functions中定义了的函数,如下图
我们也可以自己在functions中定义函数,然后就可以调用自定义函数了。如下图
也可以传参,如下图
#!/bin/bash或#!/bin/sh
#Date: 2018-01-03 时间
#Author: Create by zbf谁创作的
#Mail: 18722327399@163.com 邮箱地址
#Function:This scripts function is ... 脚本是干啥的
#Version: 1.1 版本
尽量用英文注释防止本机或切换系统环境后中文乱码的困扰。
例如:script-name.sh
[]中括号、{}大括号、‘’单引号、“”双引号、``
中括号[]两端要有空格先打中括号[]将光标移到中括号里空两个空格再回退一个,然后再写代码。
流程控制语句一次书写完成再添加内容如if 语句,for循环
原文地址:http://blog.51cto.com/10642812/2084156