shell编程实战-脚本初步入门
1.什么是Shell?
Shell是一个命令解释器,它在操作系统的最外层,负载直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕并返回给用户。这种对话方式可以是交互的方式(从键盘输入命令,可以立即得到shell的回应),或非交互式(执行脚本程序)的方式。
图解:
当linux命令或语句不在命令行下执行(严格说,命令行执行的语句也是shell脚本),而是通过一个程序文件执行时,该程序就被称为shell脚本或shell程序,shell程序很类似DOS
系统下的批处理程序。这些命令、变量和流程控制语句结合起来就形成了一个功能强大的shell脚本
。
简单的小脚本
#!/bin/bash # 清除日志脚本, 版本 2 LOG_DIR=/var/log ROOT_UID=0 # $UID为0的时候,用户才具有root用户的权限 # 要使用root用户来运行,因此,对当前用户进行判断,不合要求给出友好提示,并终止程序运行。 if [ "$UID" -ne "$ROOT_UID" ] then echo "Must be root to run this script." exit 1 fi # 如果切换到指定目录不成功,给出提示,并终止程序运行。 cd $LOG_DIR || { echo "Cannot change to necessary directory." >&2 exit 1 } # 经过上述两个判断后,此处的用户权限和路径就应该是对的了,只有清空成功,才打印成功提示。 cat /dev/null > messages &&{ echo "Logs cleaned up." exit 0 # 退出之前返回0表示成功. 返回1表示失败。 } echo "Logs cleaned up fail." exit 1
1.必须是root才能执行脚本,否则给出友好提示并终止程序运行
2.成功切换目录(cd/var/log),否则给出友好提示并终止运行
3.清理日志(cat /dev/null >messages)清理成功,给出正确提示
4.给出相应提示(echo 输出)
Shell脚本语言擅长处理纯文本类型的数据,而linux系统中几乎所有的配置文件、日志文件(如nfs、rsync、httpd、nginx、lvs
等)、绝大多数启动文件纯文件。就可以利用它在Linux
系统中发挥巨大的作用。
2.脚本语言类型
2.1 Shell脚本语言的种类
在UNIX/LINUX中主要由两大类shell
1.Bourne shell
(包括sh、ksh、bash)
Bourne shell (sh) Korn shell (ksh) Bourne Again shell (bash) POSIX shell (sh)
2. Cshell (包括csh、tcsh)
C shell (csh) TENEX/TOPS C shell (tcsh)
Shell脚本语言是弱类型
语言,较为通用的shell有标准的Bourne shell
(sh)和C shell
(csh)。其中Bourne shell
(sh)已经被bash shell取代,但是我们还是习惯称之为sh
。
查看Centos7 系统SHELL情况:
[root@node6 ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin
Linux系统中的主流shell是Bash
,它是Bourne Again Shell
的缩写,Bash是由Bourne Shell
(sh)发展而来的,但Bash与sh稍有不同,它还包含了csh
和ksh
的特色,但大多数脚本可以不加修改地在sh
上运行
3.其他常用的脚本语句种类
3.1 PHP
PHP是网页程序,也是脚本语言。是一款更专注于web页面开发(前端展示)的脚本语言,例如:Dedecms,discuz。PHP程序也可以处理系统日志,配置文件等,php也可以调用系统命令。
3.2 Perl
Perl脚本语言。比shell脚本强大很多,语法灵活、复杂,实现方式很多,不易读,团队协作困难,但仍不失为很好的脚本语言,存世大量的程序软件。MHA高可用Perl写的
3.3 Python
Python,不但可以做脚本程序开发,也可以实现web程序以及软件的开发。近两年越来越多的公司都会要求会Python。
Shell脚本与php/perl/python语言的区别和优势?
shell脚本的优势在于处理操作系统底层的业务 (linux系统内部的应用都是shell脚本完成)因为有大量的linux系统命令
为它做支撑。2000
多个命令都是shell脚本编程
的有力支撑,特别是grep
、awk
、sed
等。例如:一键软件安装、优化、监控报警脚本,常规的业务应用,shell开发更简单快速,符合运维
的简单、易用、高效原则.
PHP、Python优势在于开发运维工具
以及web界面
的管理工具,web业务的开发等。处理一键软件安装、优化,报警脚本。常规业务的应用等php/python
也是能够做到的。但是开发效率和复杂
比用shell就差很多了。
4、常用操作系统的默认shell
1.Linux是Bourne Again shell(bash)
2.Solaris和FreeBSD缺省的是Bourne shell(sh)
3.AIX下是Korn Shell(ksh)
4.HP-UX缺省的是POSIX shell(sh)
提示:比较常用Bourne Again shell
(bash)
查看Centos默认bash?
[root@node6 ~]# echo $SHELL
/bin/bash
[root@node6 ~]# echo shell
shell
[root@node6 ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
修改创建用户默认配置文件路径
[root@node6 ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
5、Shell脚本的建立和执行
5.1 shell脚本的建立
在Linux系统中,shell脚本(bash shell程序
)通常是在编辑器
(vi/vim)中编写,由Unix/Linux
命令、bash shell
命令、程序结构控制语句和注释等内容组成。
vi = 记事本
vim =编辑器emeditor、editplus notepad++
我们可以制作一个vi=vim的别名 [root@node6 ~]# alias vi='vim' [root@node6 ~]# vim /etc/profile export alias 'vi=vim' [root@node6 ~]# . /etc/profile
5.2 脚本开头(第一行)
一个规范的shell脚本在脚本第一行会指出由那个程序(解释器
)来执行脚本中的内容,这一行内容在linux bash
编程中一般为:
#!/bin/bash or #!/bin/sh <==255字符以内
其中开头的"#!"
字符又称为幻数
,在执行bash
脚本的时候,内核会根据"#!"
后的解释器来确定该用那个程序解释这个脚本中的内容。
注意:这一行必须在每个脚本顶端的第一行,如果不是第一行则为脚本注释行。
[root@node6 tmp]# cat 1.sh #!/bin/bash echo "123" #!/bin/sh <==代表注释 echo "456"
sh和bash的区别
早期的Bash
与sh
稍有不同,它还包含了csh和ksh的特色,但大多数脚本都可以不加修改地在sh上运行
[root@node6 /]# ll /bin/sh lrwxrwxrwx. 1 root root 4 May 1 04:26 /bin/sh -> bash [root@node6 /]# ll /bin/bash -rwxr-xr-x 1 root root 941720 Jul 24 2015 /bin/bash
企业面试题案例一:Centos Linux系统默认的shell是()
解答:bash
查看方法1:
[root@node6 ~]# echo $shell bash [root@node6 ~]# echo $SHELL /bin/bash
查看方法2:
[root@node6 ~]# grep root /etc/passwd root:x:0:0:root:/root:/bin/bash 提示:结尾的/bin/bash就是shell解释器
5.3 脚本注释
在shell脚本中,跟在(#)
井号后面的内容表示注释
,用来对脚本
进行注释说明,注释部分不会被当做程序执行,仅仅给用户看,系统解析器是看不到,更不会执行。
特别提示:注释尽量不使用中文
5.4 Shell脚本的执行
当shell脚本运行时,它会先查找系统环境变量ENV
,改变量指定了环境文件(通常是~./bashrc,~./bash_profile,/etc/bashrc,/etc/profile等
)然后从该环境变量文件开始执行脚本,当读取了ENV的文件后,shell才会开始执行shell脚本中的内容
特殊技巧:设置crond
任务时,最好把系统环境变量在定时脚本中重新定义,否则,一些系统环境变量不会被夹在。
Shell 脚本的执行通常可以采用以下几种方式:
1.bash script-name或sh script-name(推荐使用) 2.path/script-name或./script-name(当前路径下执行脚本) ###<==此项需要脚本有执行权限 3.source script-name 或. script-name #<==注意"."点号和后面字符之间有空格。 4.sh <script-name 或 cat script-name|sh(同样适合bash)
全路径执行如果不加命令全路径会没有权限
/server/scripts/abc.sh 权限不够 /bin/sh /server/scripts/abc.sh 可以执行
提示:
第三种方法通常是使用source
或者".
"点号读入或加载指定的shell脚本文件(如san.sh),然后,依次执行指定shell脚本文件san.sh 中的所有语句。这些语句将作为当前父shell脚本运行。
source
或者".
"点号命令的功能是在当前shell中执行source或者"."点号加载并执行相关脚本文件中的命令以及语句,而不是产生一个字shell来执行命令文件中的命令。
脚本里面的内容是无法和外面的变量沟通,但是外面的变量在脚本里面是可以引用的。
如果想在脚本里面的变量引用到命令行需要使用source or .