第一章·shell编程基础入门

shell基本概述:

为什么要使用shell:

  1. 安装操作系统(CentOS)自动化安装操作系统(kickstart cobbler)底层shell
  2. 初始化/优化操作系统
    1. ntp时间同步
    2. 更改默认yum源
    3. ssh优化
    4. 关闭Selinux
    5. 关闭/开启 防火墙(C6:iptables C7:firewalld)
    6. 安装基础服务(wget vim lrzsz net-tools unzip gzip...)
    7. 优化文件描述符
    8. 优化字符集
    9. ...
  3. 安装服务
    1. Nginx
    2. PHP
    3. MySQL
    4. Redis
    5. HMA
    6. Rsync
    7. NFS
    8. MongoDB
    9. Zabbix
    10. ...
  4. 启动服务(系统默认的shell脚本)
  5. 脚本实现自动化代码上线
  6. 监控服务(使用shell)
  7. 结合定时任务使用shell
  8. 重复性工作写入脚本
    1. 日志切割
    2. 日志分析
    3. 数据统计
    4. 机器巡检
    5. 数据备份
    6. ...

shell编程和基础知识

  1. 熟悉使用vim编辑器
  2. 熟悉ssh终端(Xshell、CRT)
  3. 熟悉掌握linux常用命令
  4. 熟悉掌握linux正则表达式及三剑客命令

如何学好shell编程

  1. 环境变量
  2. 条件表达式
  3. 流程控制语句
  4. 循环
  5. 数组
  6. 函数

学习shell三部曲:

先读懂shell

再修改shell

自己写shell

找一本合适的教材、或者自己认真做的较为全面的笔记 大忌:不可拿来主义,可以模仿,但是要自己嚼烂了在吃下 学完shell 可解决企业中大部分脚本问题

什么是shell

file
1.交互式shell

交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。

2.非交互式

shell shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。

什么是shell脚本

把在命令行执行的命令放在一个文件里统一执行,称为Shell脚本 包含若干个linux命令、循环语句,条件语句等。

shell脚本规范

1.目录统一

2.shell脚本的结尾要以.sh结尾

3.脚本的开头需要有解释器

#!/bin/bash

4.脚本中需要有作者信息

#!/bin/bash
#Author: _rowey_
#Date: _1999-12-20_
#Name: _Print Message_

5.必须要加注释(开发规范,运维规范...)

6.shell中的文字尽量使用英文

7.成对的符号和语句一次性书写完

此处介绍一个vim模板

# 1.首先先编辑一个模板文件,该模板文件可以叫任何名字
[root@zabbix01 ~]# vim /usr/share/vim/vimfiles/template.lw
#!/bin/bash
#Author: _rowey_
#Date: _1999-12-20_
#Name: _Print Message_

# 2.写完之后,我们需要修改一下vim的配置文件
[root@zabbix01 ~]# vim /etc/vimrc
autocmd BufNewFile *.spec 0r /usr/share/vim/vimfiles/template.spec
## 在第28行,autocmd自动保存模板文件,修改一下,因为我们是要写shell脚本的模板
## 所以我们要把*.spec 修改成*.sh
## 然后将后面的模板文件改成你定义的模板文件名
autocmd BufNewFile *.sh 0r /usr/share/vim/vimfiles/template.lw

# 3.接下来,我们编辑所有只要以sh结尾的文件,都会带有作者信息
[root@zabbix01 ~]# vim test_lw.sh

#1.模板二
## 在用户家目录编辑以下内容
[root@zabbix01 ~]# vim /root/.vimrc
autocmd bufNewFile *.py,*.sh,*.java exec ":call SetTitle()"
func SetTitle()
  if expand("%:e") == 'sh'
      call setline(1, "#!/bin/bash")
      call setline(2, "")
      call setline(3, "# File Name: __".expand("%") . "__")
      call setline(4, "# Version: __v1.1__ ")
      call setline(5, "# Author: __rowey__ ")
      call setline(6, "# Mail: __1627556442@qq.com__ ")
      call setline(7, "# Blog: __https://roweyy.com__ ")
      call setline(8, "# DateTime: __".expand(strftime("%Y-%m-%d %H:%M")) . "__")
  endif
endfunc

脚本的执行方式

[root@m01 ~]# vim test.sh
#!/bin/bash
#Author: _rowey_
#Date: _1999-12-20_
#Name: _Print Message_

echo 'Hello World'

#执行脚本
[root@m01 ~]# sh test.sh
Hello World
[root@m01 ~]# bash test.sh
Hello World
[root@m01 ~]# ./test.sh
Hello World
[root@m01 ~]# /root/test.sh
Hello World
[root@m01 ~]# . test.sh
Hello World
[root@m01 ~]# source test.sh
Hello World

. 和 source 都是在父shell下执行的

sh , bash , 相对路径 , 绝对路径都是在子shell下执行的

开发语言中程序代码的分类

编译型

写完后,需要编译才能运行。开发书写的代码,无法直接运行,需要编译(Java、C语言、等)

# 编辑代码
[root@m01 ~]# vim hello.c
#include <stdio.h>

void main(){
  printf("hello world");
}

#编译成二进制文件
[root@m01 ~]# gcc hello.c -o hello.bin

[root@m01 ~]# ll
总用量 16
-rwxr-xr-x 1 root root 8440 8月  26 09:40 hello.bin
-rw-r--r-- 1 root root   60 8月  26 09:39 hello.c

[root@m01 ~]# file hello.bin
hello.bin: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=c248ed9f695c05ece7d46731556e86eb0ac6bc11, not stripped

[root@m01 ~]# ./hello.bin
hello world

解释型

书写完成,通过命令解释器运行。书写完成后,使用对应的命令解释器(shell、python、等)

[root@m01 ~]# vim hello.sh
[root@m01 ~]# cat hello.sh
#!/bin/bash
echo 'hello world'

[root@m01 ~]# ll
总用量 20
-rwxr-xr-x 1 root root 8440 8月  26 09:40 hello.bin
-rw-r--r-- 1 root root   60 8月  26 09:39 hello.c
-rw-r--r-- 1 root root   31 8月  26 09:44 hello.sh
[root@m01 ~]# file hello.sh
hello.sh: Bourne-Again shell script, ASCII text executable
[root@m01 ~]# sh hello.sh
hello world

山林不向四季起誓 荣枯随缘