学习shell的前置知识准备:
1 vi命令 .vimrc设置搞熟
2 100多个基本命令
3 基础/高端 网络服务都要会。
shell概念:
a) 是命令解释器,是操作系统最外层,负责直接和用户对话,
b) 将用户的输入解释给操作系统,
c) 处理操作系统的数据结果,返回到屏幕
d) 这种对话方式可以 交互的(键盘输入命令-->shell-->操作系统-->shell处理返回结果-->屏幕展示),
也可以是 非交互(脚本)方式
e) 单词是贝壳,见名知意,贝壳保护操作系统核心
shell所在位置图:
shell脚本概念:
a) 当命令或语句不在命令行执行,而是通过一个程序文件执行时,该程序就叫做shell脚本/shell程序
b) shell脚本/shell程序 你可以类比于 DOS系统下的批处理程序(*.bat)
c) shell脚本/shell程序 是 命令,变量,流程控制语句 有机的结合体
shell在运维中的作用:
a) linux几乎所有的配置文件,日志文件都是纯文本类型文件
b) shall脚本擅长处理纯文本类型的数据
c) shell可以处理的有:
基础命令, apache服务,mysql服务,php服务,nginx服务,lvs+keepalive服务, cacti/mrtg流量及监控
iptables防火墙, nagios监控服务, ssh key 服务, rsync服务, 定时服务 .....
shell脚本和其余脚本语言的侧重点:
shell语言是弱类型语言。
shell脚本优势在于处理操作系统底层的业务(eg: 一键安装, 报警脚本,常规业务应用)
约2000多个linux命令都在为shell脚本提供服务, shell操作起来更加简单快速。
php,python 优势在于开发运维工具, web界面的管理工具上。
常用操作系统的默认shell版本:
linux是 Bourne Again shell(bash)
Solaris和FreeBSD 是 Bourne shell(sh)
AIX 是 Korm Shell(ksh)
HP-UX 是 POSIX shell(sh)
那么我们常用的 centos linux 默认的shell 是 bash, 可用如下命令确认:
[root@sliver114 log]# echo $SHELL /bin/bash
shell脚本的建立:
a) 脚本开头:第一行会指出是由哪个程序(解析器)来执行脚本的内容
写法为: #! /bin/bash 或 #! /bin/sh,
其中, sh是bash的软链接,即使使用 #! /bin/sh 也会真正执行 #! /bin/bash
[root@sliver114 ~]# ll /bin/sh lrwxrwxrwx 1 root root 4 Jul 17 04:23 /bin/sh -> bash
建议使用标准写法 #! /bin/bash
#! 是幻数,内核会根据它来确认哪个程序来执行脚本中的内容, 其后的 /bin/bash
上述写法也只能写在第一行,如果写在别的行中,失去意义也不会被执行。
eg:
[root@sliver114 ~]# cat test1.sh #!/bin/bash echo "hello start" #!/bin/sh #!/bin/sh echo "world end" [root@sliver114 ~]# sh test1.sh hello start world end 可见, test1.sh中 第4,5行的#!/bin/sh 均没有执行
如果脚本开头没有指定解释器, 那么在执行时需要显式指定解释器, eg:
bash test.sh
python test.py
shell 脚本的执行:
bash 脚本名称.sh 或者 sh 脚本名称.sh
shell脚本开发规范:
a) 开头指定脚本解释器 #!/bin/bash
b) 开头加入版本版权信息 , 建议通过修改 ~/.vimrc 配置文件自动增加如下信息
#Date:
#Author:
#Mail:
#Function:
#Version:
c) 脚本中不要有中文
d) 脚本以 .sh为扩展名
e) 代码书写习惯优秀
e.1) 成对内容一次写出 eg: "" {} [] ''
e.2) [] 中括号两端各要有一个空格
e.3) 流程控制语句一次书写完 eg: if for while until case等
if
then
内容
fi
for n in list
do
内容
done
e.4) 通过缩进让代码易读
shell脚本变量简介:
a) 变量类型:
全局变量: 在创建全局变量的shell 以及派生出来的子进程shell中使用。
局部变量: 只能在创建局部变量的shell函数/脚本中使用
b) 环境变量:
b.1) 用于定义shell的运行环境,保证shell的正确执行,eg:shell通过环境变量来确定登陆用户名,
命令路径,终端类型,登陆目录等
b.2) 所有环境变量都是系统全局变量,作用于所有子进程
b.3) 环境变量可以在命令行中设置,但用户退出时设置的数值将消失
b.4) 建议将全局变量配置在 /etc/profile 或者 家目录下的.bash_profile, 防止用户退出时失效, 设置好的环境变量会在用户登录时被初始化。 eg:[root@sliver114 ~]# vi /etc/profile 里面添加 ONE=1 退出后 [root@sliver114 ~]# source /etc/profile 强制立即生效 [root@sliver114 ~]# echo $ONE 然后打印.得到配置的全局变量ONE的结果为1 1查看所有已定义的全局环境变量:
[root@sliver114 ~]# printenv HOSTNAME=sliver114 TERM=vt100 SHELL=/bin/bash HISTSIZE=1000 SSH_CLIENT=192.168.1.156 53768 22 SSH_TTY=/dev/pts/1 ..........
c) 局部变量
c.1) 生命周期仅存在于用户当前的shell脚本,当启动另一进程或者退出将失效。
c.2) 定义方式为: 变量名=value, 建议 如果是数字类型不需要加引号,如果是其他类型加上""
eg: two=2 name="zm" ""会把里面的内容如果能执行的话先执行在输出
[root@master shelldir]# name="zm" [root@master shelldir]# echo "my name is $name" my name is zm
c.3)
d) 变量调用
使用 ${定义的变量名} 或者 直接使用 $定义的变量名
eg: [root@sliver114 ~]# echo ${TWO} 等同于
[root@sliver114 ~]# echo $TWO
f) 把命令定义为变量:
如下以 局部变量为例:
[root@sliver114 ~]# cmd=`date +%F` [root@sliver114 ~]# echo $cmd 2014-08-20 [root@sliver114 ~]# cmd=`date` [root@sliver114 ~]# echo $cmd Wed Aug 20 22:40:35 PDT 2014 ``(两个反引号)是键盘tab键上面的那个字符 或者用:(推荐使用 注意定义时候 =左右不要有空格) [root@sliver114 ~]# cmd=$(date +%F) [root@sliver114 ~]# echo $cmd 2014-08-20