1.编程基础
Linus:Talk is cheap, show me the code
1.1 程序组成
- 程序:算法+数据结构
- 数据:是程序的核心
- 数据结构:数据在计算机中的类型和组织方式
- 算法:处理数据的方式
1.2 程序编程风格
- 面向过程语言
- 做一件事情,排出个步骤,第一步干什么,第二步干什么,如果出现情况A,做什么处理,如果出现了情况B,做什么处理
- 问题规模小,可以步骤化,按部就班处理
- 以指令为中心,数据服务于指令
- C,shell
- 面向对象语言
- 将编程看成是一个事物,对外界来说,事物是直接使用的,不用关心事物内部的情况。而编程就是设置事物能够完成功能。
- 一种认识世界、分析世界的方法论。将万事万物抽象为各种对象
- 类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合
- 对象是类的具象,是一个实体
- 问题规模大,复杂系统
- 以数据为中心,指令服务于数据
- java,C#,python,golang等
1.3 编程语言
计算机:运行二进制指令
编程语言:人与计算机之间交互的语言。分为两种:低级语言和高级语言
- 低级编程语言:
- 机器:二进制的0和1的序列,称为机器指令。与自然语言差异太大,难懂、难写
- 汇编:用一些助记符号替代机器指令,称为汇编语言
- 如:ADD A,B 将寄存器A的数与寄存器B的数相加得到的数放到寄存器A中
- 汇编语言写好的程序需要汇编程序转换成机器指令
- 汇编语言稍微好理解,即机器指令对应的助记符,助记符更接近自然语言
- 高级编程语言:
- 编译:高级语言–>编译器–>机器代码文件–>执行,如:C,C++
- 解释:高级语言–>执行–>解释器–>机器代码,如:shell,python,php,JavaScript,perl
编译和解释型语言
1.4 编程逻辑处理方式
三种处理逻辑
- 顺序执行:程序按从上到下顺序执行
- 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
- 循环执行:程序执行过程中需要重复执行多次某段语句
2.shell 脚本语言的基本用法
2.1 shell 脚本的用途
- 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
- 减少手工命令的重复输入,一定程度上避免人为错误
- 将软件或应用的安装及配置实现标准化
- 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等
2.2 shell 脚本基本结构
shell脚本编程:是基于过程式、解释执行的语言
编程语言的基本结构:
- 各种系统命令的组合
- 数据存储:变量、数组
- 表达式:a + b
- 控制语句:if
shell脚本:包含一些命令或声明,并符合一定格式的文本文件
格式要求:首行shebang机制
#!/bin/bash
#!/usr/bin/python
#!/usr/bin/perl
2.3 shell脚本创建过程
第一步:使用文本编辑器来创建文本文件
第一行必须包括shell声明序列:#!
示例:
#!/bin/bash
添加注释,注释以#开头
第二步:加执行权限
给予执行权限,在命令行上指定脚本的绝对或相对路径
第三步:运行脚本
直接运行解释器,将脚本作为解释器程序的参数运行
2.4 shell 脚本注释规范
1、第一行一般为调用使用的语言
2、程序名,避免更改文件名为无法找到正确的文件
3、版本号
4、更改后的时间
5、作者相关信息
6、该程序的作用,及注意事项
7、最后是各版本的更新简要说明
2.5 第一个脚本
#!SHEBANG
CONFIGURATION_VARIABLES
FUNCTION_DEFINITIONS
MAIN_CODE
范例:第一个 Shell 脚本 hello world
参考文档:
https://zh.wikipedia.org/wiki/Hello_World
https://zh.wikipedia.org/wiki/Hello_World%E7%A8%8B%E5%BA%8F%E6%A0%B7%E4%BE%8B
[root@rocky8 ~]# echo $SHELL
/bin/bash
[root@rocky8 data]# vim hello.sh
#!/bin/bash
#
#**********************************************************************************************
#Author: Raymond
#QQ: 88563128
#Date: 2021-10-08
#FileName: hello.sh
#URL: raymond.blog.csdn.net
#Description: The test script
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
#经典写法
echo "hello, world"
#流行写法
echo 'Hello, world!'
#执行方法1
[root@rocky8 data]# bash hello.sh
hello, world
Hello, world!
#执行方法2
[root@rocky8 data]# cat hello.sh | bash
hello, world
Hello, world!
#执行方法3
[root@rocky8 data]# chmod +x hello.sh
#绝对路径
[root@rocky8 data]# /data/hello.sh
hello, world
Hello, world!
#相法路径
[root@rocky8 data]# ./hello.sh
hello, world
Hello, world!
#执行方法4,本方法可以实现执行远程主机的shell脚本
[root@rocky8 data]# yum -y install httpd
[root@rocky8 data]# systemctl enable --now httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.
[root@rocky8 data]# mv hello.sh /var/www/html/
[root@rocky8 data]# curl -s http://172.31.1.8/hello.sh | bash
hello, world
Hello, world!
范例:备份脚本
[root@rocky8 data]# vim backup.sh
#!/bin/bash
#
#**********************************************************************************************
#Author: Raymond
#QQ: 88563128
#Date: 2021-10-09
#FileName: backup.sh
#URL: raymond.blog.csdn.net
#Description: The test script
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
echo -e "\033[1;32mStarting backup...\033[0m"
sleep 2
cp -av /etc/ /data/etc`date +%F_%H-%M-%S`/
echo -e "\033[1;32mBackup is finished\033[0m"
[root@rocky8 data]# bash backup.sh
Starting backup...
'/etc/' -> '/data/etc2021-10-08_18-39-03/'
'/etc/dnf' -> '/data/etc2021-10-08_18-39-03/dnf'
...
'/etc/nftables/nat.nft' -> '/data/etc2021-10-08_18-39-03/nftables/nat.nft'
'/etc/nftables/router.nft' -> '/data/etc2021-10-08_18-39-03/nftables/router.nft'
'/etc/rsyslog.d' -> '/data/etc2021-10-08_18-39-03/rsyslog.d'
Backup is finished
[root@rocky8 data]# ll
total 16
-rw-r--r-- 1 root root 561 Oct 8 18:38 backup.sh
drwxr-xr-x. 84 root root 8192 Oct 8 18:35 etc2021-10-08_18-39-03
2.6 shell 脚本调试
只检测脚本中的语法错误,但无法检查出命令错误,但不真正执行脚本
bash -n /path/to/some_script
调试并执行
bash -x /path/to/some_script
范例:
[root@rocky8 data]# vim test.sh
#!/bin/bash
#
#**********************************************************************************************
#Author: Raymond
#QQ: 88563128
#Date: 2021-10-09
#FileName: test.sh
#URL: raymond.blog.csdn.net
#Description: The test script
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
hostname
cat >app.conf <<EOF
line1
line2
line3
EOF
whoami
[root@rocky8 data]# bash test.sh
rocky8
root
[root@rocky8 data]# ll app.conf
-rw-r--r-- 1 root root 18 Oct 9 13:49 app.conf
[root@rocky8 data]# cat app.conf
line1
line2
line3
[root@rocky8 data]# vim test.sh
#!/bin/bash
#
#**********************************************************************************************
#Author: Raymond
#QQ: 88563128
#Date: 2021-10-09
#FileName: test.sh
#URL: raymond.blog.csdn.net
#Description: The test script
#Copyright (C): 2021 All rights reserved
#*********************************************************************************************
hostname
cat >app.conf <<EOF
line1
line2
line3
line4
EOF #假如在EOF后边输了个空格
whoami
[root@rocky8 data]# bash test.sh
rocky8
test.sh: line 18: warning: here-document at line 13 delimited by end-of-file (wanted `EOF')
[root@rocky8 data]# cat -A test.sh
#!/bin/bash$
#$
#**********************************************************************************************$
#Author: Raymond$
#QQ: 88563128$
#Date: 2021-10-09$
#FileName: test.sh$
#URL: raymond.blog.csdn.net$
#Description: The test script$
#Copyright (C): 2021 All rights reserved$
#*********************************************************************************************$
hostname$
cat >app.conf <<EOF$
line1$
line2$
line3$
line4$
EOF $
whoami$
#用cat -A 查看不可见字符,或者进入vim输入:set list
[root@rocky8 data]# bash -n test.sh
test.sh: line 18: warning: here-document at line 13 delimited by end-of-file (wanted `EOF')
#用bash -n 先检查语法
[root@rocky8 data]# vim test.sh
#!/bin/bash$
#$
#**********************************************************************************************$
#Author: Raymond$
#QQ: 88563128$
#Date: 2021-10-09$
#FileName: test.sh$
#URL: raymond.blog.csdn.net$
#Description: The test script$
#Copyright (C): 2021 All rights reserved$
#*********************************************************************************************$
hostname$
cat >app.conf <<EOF$
line1$
line2$
line3$
line4$
EOF$
whoami$
[root@rocky8 data]# bash -n test.sh
[root@rocky8 data]# bash test.sh
rocky8
root
[root@rocky8 data]# bash -x test.sh
+ hostname
rocky8
+ cat
+ whoami
root
#bash -x 可以跟踪执行命令
总结:脚本错误常见的有三种
- 语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
- 命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
- 逻辑错误:使用 bash -x 进行观察