shell编程实战-脚本初步入门

1.什么是Shell?

Shell是一个命令解释器,它在操作系统的最外层,负载直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕并返回给用户。这种对话方式可以是交互的方式(从键盘输入命令,可以立即得到shell的回应),或非交互式(执行脚本程序)的方式。

图解:
1.jpg-16.1kB
  当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系统中发挥巨大的作用。
image_1b16oaub2mv9phi1bm54m314eu2a.png-119.3kB

 

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稍有不同,它还包含了cshksh的特色,但大多数脚本可以不加修改地在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脚本编程的有力支撑,特别是grepawksed等。例如:一键软件安装优化监控报警脚本,常规的业务应用,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的区别
  早期的Bashsh稍有不同,它还包含了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 .

posted @ 2018-05-23 11:28  活的潇洒80  阅读(2466)  评论(0编辑  收藏  举报