shell脚本基础知识一

1  shell脚本基础知识

1.1  目录

  • shell简介
    • 什么是shell
    • 什么是shell脚本
    • shell脚本在linux系统运维工作中的地位
  • shell脚本的建立和执行
    • shell脚本的建立
    • shell脚本的执行
    • shell脚本开发的基本规范及习惯
  • shell脚本变量
    • 什么是变量
    • 环境变量
    • 普通变量
    • shell中的特殊位置参数变量
    • 特殊进程中的状态变量
  • shell脚本的条件测试与比较
    • 条件测试方法
    • test和[]
    • 文件测试
    • 字符串测试
    • 整数测试
    • 逻辑测试
  • if条件语句及实战
    • if条件语句语法
    • if条件语句实战
  • case条件语句及实战
    • case条件语句语法
    • case条件语句实战

1.2  shell简介

1.2.1  什么是shell

shell是指“提供使用者使用界面”的软件(命令解析器)。它类似于DOS下的command和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。

1.2.2  什么是shell脚本

Shell脚本与Windows/Dos下的批处理相似,也就是用各类命令预先放入到一个文件中,方便一次性执行的一个程序文件,主要是方便管理员进行设置或者管理用的。

1.2.3  shell脚本在linux系统运维工作中的地位

Shell脚本语言很适合用于处理纯文本类型的数据,而Linux系统中几乎所有的配置文件、日志文件(如NFS、Rsync、Httpd、Nginx、LVS、MySQL等),以及绝大多数的启动文件都是纯文本类型的文件。因此,学好Shell脚本语言,就可以利用它在Linux系统中发挥巨大的作用。_auto_0

1.3  shell脚本的建立和执行

1.3.1  shell脚本的建立

shell脚本在编辑器vi(vim)中编写 1.脚本开头

#!/bin/bash或#!/bin/sh 符号#!用来告诉系统它后面的参数是用来执行该文件的程序 2.脚本注释 以#开头的行表示注释_auto_0由上图可见,sh为bash的软链接,大多数情况下,在脚本的开头使用“#!/bin/bash”和“#!/bin/sh”是没有区别的,但是更规范的写法是在脚本开头使用“#!/bin/bash”

1.3.2  shell脚本的执行

通常采用以下几种方法:
1.bash 脚本文件名或sh 脚本文件名;注意,脚本文件名需为绝对路径,如不是,则需进入文件所在目录后再执行
2.路径/脚本文件名 或./脚本文件名;注意,需先加可执行权限,使用chmod +x 脚本文件名
3.source 脚本文件名或. 脚本文件名;
前两种方法的执行方式其实是一样的,都是在当前父进程下的子进程中执行,子进程完成后,子进程中的各项变量或操作将会结束而不会传回到父进程中.
具体的区别可见下图:_auto_1

1.3.3  shell脚本开发的基本规范及习惯

脚本编写规范
1.第一行指定脚本解释器

#!/bin/bash或#!/bin/sh
2.脚本开头加版本和版权信息_auto_2

知识补充,添加版本信息的方法:
vim .~/vimrc
autocmd BufNewFile .py,.cc,.sh,.java exec ":call SetTitle()"
func SetTitle()
if expand("%:e") == "sh"
call setline(1,"#!/bin/bash")
call setline(2,"#Author:ZhangMiaomiao")
call setline(3,"#http://blog.csdn.net/moledyzhang")
call setline(4,"#Time:".strftime("%F %T"))
call setline(5,"#Name:".expand("%"))
call setline(6,"#Version:V1.0")
call setline(7,"#Description:")
endif
endfunc

3.尽量不用中文(不限于注释)
4.为便于标识,以.sh为扩展名
5.一行一条命令;若一行多个命令,用分号(;)分割;长命令可以使用反斜线字符(\)
6.放在固定路径下,文件名尽量描述清楚脚本的功能
良好的习惯:
1.成对符号,如‘’,“”,``,(),{},[]等尽量一次性写出来
2.[的右端和]的左端留空格
3.对于流程控制语句,应一次性写完,如
if ;then
内容
fi
再如:
for
do
内容
done
4.代码缩进
5.所有的单引号、双引号和反单引号等其他标点符号都需要在英文状态下输入
6.变量赋值时等号=左右两面不留空格

1.4  shell脚本变量

1.4.1  什么是变量

变量就是暂时存放数据的地方及数据标记,所存储的数据存放在内容空间当中,通过正确地调用内存空间中的变量的名字就可以取出与变量对应的数据。 使用变量的好处是使程序开发更加方便

1.4.2  变量类型

全局变量(环境变量):可以在创建的它们的shell及其派生出来的任意子进程shell中使用,环境变量又可以分为自定义环境变量和bash内置的环境变量,(环境变量一般用于定义shell运行环境,保证shell命令的正确执行.) 局部变量(普通变量):只能在创建他的shell函数或脚本中进行操作调用

1.4.3  环境变量

1.4.4  普通变量

1.变量的命名 变量名的命名须遵循如下规则: 首个字符必须为字母(a-z,A-Z)
中间不能有空格,可以使用下划线(_)
不能使用标点符号
不能使用bash里的关键字(可用help命令查看保留关键字)
2.变量的赋值
变量名=值
变量名='值'
变量名="值"
变量名=`值`
单引号:所有转移符全部关闭,完整的反应括号中的内容

双引号:部分转义符关闭,但某些则保留(如:$)

反引号:反引号内荣作为一个系统命令并执行

3.变量的调用

1) $变量名

2) ${变量名}

1.4.5  shell中的特殊位置参数变量

_auto_0

1.4.6  特殊进程中的状态变量

_auto_2

1.5  shell脚本的条件测试与比较

1.5.1  条件测试方法

通常在脚本的编写过程中需要进行各种测试,然后根据测试结果执行不同的操作,有时也会与if等条件语句结合来完成测试 条件测试常用的语法_auto_3[[]]中可以使用通配符进行匹配 (())常用于整数运算

补充:逻辑操作符&&合||
例:
rm -rf / || echo "me is loser" (||的含义)
当rm -rf /执行不成功时,就输出me is loser
rm -rf / && echo "快跑路吧兄弟"
当rm -rf /执行成功时,就输出快跑路吧兄弟

1.5.2  文件测试

常见的文件测试操作符如下:_auto_4

1.5.3  字符串测试

常见的字符串测试操作符如下:_auto_5

1.5.4  整数测试

常见的整数测试操作符如下:_auto_6

1.5.5  逻辑测试

常见的逻辑测试操作符如下:_auto_7

1.6  if条件语句及实战

1.6.1  if条件语句语法

1、单分支
if <条件表达式>;then
操作
fi
2、双分支
if <条件表达式>;then
操作1
else
操作2
fi
3、多分支
if <条件表达式>;then
操作1
elif <条件表达式>;then
操作2
elif <条件表达式>;then
操作3
......
else
操作
fi

1.6.2  if条件语句实战

监控MySQL的企业案例
案例描述:监控mysql服务的运行状态,如果正常则输出“MySQL is running.”,否则输出“MySQL is stoped.”
—————————————————————思路比技术更重要————————————————————
思路分析:
1.环境准备
2.监控mysql服务是否异常
1)监控mysql服务的方法有哪些
2)如何找出测试条件
3.开发监控脚本
具体实现:
1.环境准备
yum -y install mysql-server
service mysqld start
2.解决思路 1)查mysql服务的状态
2)判断相应的命令结果判断是否正常
_auto_2

3.开发监控脚本
方法一:端口判断

#!/bin/bash

#Author:ZhangMiaomiao

#http://blog.csdn.net/moledyzhang

#Time:2017-10-10 01:19:26

#Name:monitor_mysql.sh

#Version:V1.0

#Description:
port=`netstat -ntulp|grep mysql|wc -l`
if [ $port -eq 1 ];then
echo "MySQL is running."
else
echo "MySQL is stoped."
fi

方法二:进程判断

ps -ef|grep mysql&>/dev/null 
if [ $? -eq 0 ];then
echo "MySQL is running."
else
echo "MySQL is stoped."
fi

或是
proc=`ps -ef|grep mysql|grep -v grep|wc -l`
if [ $proc -eq 2 ];then
echo "MySQL is running."
else
echo "MySQL is stoped."
fi

方法三:登录判断
mysql -h 172.18.45.58 -uroot -p123 -e "select version();"&>/dev/null
if [ $? -eq 0 ];then
echo "MySQL is running."
else
echo "MySQL is stoped."
fi

1.7  case条件语句及实战

1.7.1  case条件语句语法

case "变量" in
值1|值2)
操作 ;;
值3|值4) 
操作 ;;
值5|值6) 
操作 ;;
*)
默认操作;;
esac

1.7.2  case条件语句实战

nginx服务管理脚本
案例描述:已知nginx服务的管理命令如下:
启动服务的命令:/usr/local/nginx/sbin/nginx
停止服务的命令:/usr/local/nginx/sbin/nginx -s stop
请用case语句开发脚本,以实现nginx服务启动及关闭的功能,具体方法为:/etc/init.d/nginx {start|stop|restart}或service nginx {start|stop|restart},并实现通过chkconfig进行开机自启动管理
解决思路:
一、环境准备
下载nginx:http://nginx.org/en/download.html
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
tar -xvf nginx-1.12.1.tar.gz
cd tar -xvf nginx-1.12.1
./configure --prefix=/usr/local/nginx
make&&make install
开启
/usr/local/nginx/sbin/nginx
二、脚本过程分析
1.先判断nginx的pid文件是否存在(nginx服务正常启动后pid文件就会存在),如果不存在,即表示nginx没有运行,则运行nginx服务的启动命令(start),待要停止时,如果pid文件存在,就运行nginx服务停止命令,否则不运行(stop函数)
2.通过case语句进行判断,判断的值为start、stop、restart等
3.处理返回值,使得更专业
4.通过chkconfig管理nginx,实现开机自启动
三、开发脚本 最后实现的脚本如下:

In [ ]:
#chkconfig: 35 85 15   #设定35级别,开机第85位启动脚本,关机第15为关闭脚本
#description:start/stop/restart nginx
path=/usr/local/nginx/sbin
pid=/usr/local/nginx/logs/nginx.pid
RETVAL=0        #设定RETVAL为0,作为返回值变量
. /etc/rc.d/init.d/functions  #加载系统函数库,方便后面使用action等函数
start() #定义start函数
{
    if [ ! -f $pid ];then  #如果pid文件不存在,则执行启动命令
        $path/nginx
        RETVAL=$?  #获取启动命令后的返回值
        if [ $RETVAL -eq 0 ];then
            action "Starting nginx:" /bin/true  #打印专业的启动提示
            return $RETVAL
        else
             action "Starting nginx:" /bin/false #打印专业的启动失败提示
             return $RETVAL
        fi
    else
        echo "nginx is running"   #如果pid文件存在,则输出正在运行的提示
        return 0
    fi
}
stop() #定义stop函数
{
    if [  -f $pid ];then  #如果pid文件存在,则执行停止命令
    $path/nginx -s stop
        RETVAL=$?  #获取停止命令后的返回值
        if [ $RETVAL -eq 0 ];then
            action "Stopping nginx:" /bin/true  #打印专业的停止提示
            return $RETVAL
        else
             action "Stopping nginx:" /bin/false #打印专业的停止失败提示
             return $RETVAL
        fi
    else
        echo "nginx is no running"   #如果pid文件不存在,则输出已经停止的提示
        return $RETVAL
    fi
}
case "$1" in  #通过$1接收脚本的参数(start|stop|restart)
start)
    start
    RETVAL=$?;;   #获取start函数执行后的返回值
stop)
    stop
    RETAVL=$?;;
restart)
    stop
    sleep 1
    start
    RETVAL=$?;;
*)
    echo "Usage:$0 {start|stop|restart}"
    exit 1;;
esac
exit $RETAVL  #将脚本的返回值返回值当前shell

执行结果如下图:_auto_0然后加入开机自启动:_auto_1

In [ ]:
chkconfig --add nginx
chkconfig nginx on
chkconfig nginx --list

----------------未完,待续----------


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章