一. 了解编程
1.程序编程风格
面向过程语言
开发的时候 需要一步一步执行
-
问题规模小,可以步骤化,按部就班处理
-
以指令为中心,数据服务于指令
-
C,shell
面向对象语言
开发的时候 将任务当成一个整体
-
将编程看成是一个事物,对外界来说,事物是直接使用的,不用关心事物内部的情况。而编程就是设置事物能够完成功能。
-
类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合
-
对象是类的具象,是一个实体
-
问题规模大,复杂系统
-
以数据为中心,指令服务于数据
-
java,python,golang 等
2. 处理逻辑
顺序执行:程序按从上到下顺序执行
选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
循环执行:程序执行过程中需要重复执行多次某段语句(已知次数 已知条件 死循环)
二 .Shell脚本的编程概述
1.shell脚本简介
1.1 基本概念
Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈个用户,这种对话方式可是交互也可是非交互的,我们所输入的命令计算机是不是别的,这是就需要一种程序来帮助我们进行翻译,编号才能计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们。
1.2 应用场景
-
重复性操作
-
交互性任务
-
批量事务处理
-
服务运行状态监控
-
定时任务执行
1.3 作用
shell是一个特殊的应用程序,它介于操作系统内核和用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
1.4 linux中有哪些shell
查看本机shell种类
解释:
- sh:已经被bash替换
- bash:基于gun的框架下发展的shell
- csh:类似c语言的shell
- tcsh:整合了csh提供了更多功能
bash (/bin/bash)是目前大多数Linux 版本采用的默认shell
2.shell 脚本的编写规范和执行方法
2.1 构成
- 解释器 脚本是用什么语言写的
- 注释 解释语句的含义
- 执行语句
脚本申明(解释器) :若第一行为“!/bin/bash",表示此行以下的代码语句是通过/bin/bash程序来解释执行,#!/bin/bash为默认解释器。还有其它类型的解释器,
比如 #!/usr/bin/python. #!/usr/bin/expect.
注释信息:以“#"开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行。
可执行语句:比如echo命令,用于输出""之间的字符串
2.2 如何执行
- 使用路径执行 需要加执行权限
- 直接使用解释器 不需要权限
- source 和 . 执行 不需要执行权限
#法一:指定路径的命令,要求文件必须有x权限
[root@localhost ~]#chmod +x /test/first.sh
[root@localhost ~]#/test/first.sh
#法二:指定Shell来解释脚本,不要求文件必须有x权限。
[root@localhost ~]#bash first.sh
#法三:source 脚本路径执行shell脚本
[root@localhost ~]#source first.sh
[root@localhost ~]#. first.sh
使用前两种方式执行脚本会开启子bash 环境去执行脚本
使用source 和 . 会影响当前的bash环境 不推荐使用
前两种使用的子shell 不影响当前环境
2.3 脚本文件命名要求
区分大小写
不能使程序中的保留字和内置变量:如: if, for, hostname
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线“-",和主机名相反
不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
驼峰StudentFirstName
小驼峰studentFirstName·
下划线: student_name
2.4 脚本错误
1.命令错误:命令出错不会影响下面的操作,下面的命令继续
2.语法错误:会影响接下来的命令继续
3.逻辑错误:只能自己去筛查
查找代码的正确:
bash -n 脚本名称 (不在当前目录下加绝对路径) 检查语法错误
bash -x 脚本名称 (不在当前目录下加绝对路径) 检查逻辑错误
命令出错,不影响下面的操作
语法错误,下面的操作不继续
查找代码是否正确:
总结:
-
语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
-
命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
-
逻辑错误:只能使用 bash -x 进行
2.5 出错解决
2.5.1 set -e
在脚本前面输入 set -e 一旦出错立即停止
2.5.2 set -u
变量不存在就不让执行
三.重定向与管道操作
1.重定向
1.1 交互式硬件设备
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
1.2 重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | 标准错误输出结果追加到指定的文件尾部 | |
混合输出 | &>无论对错都可以重定向 | 将标准输出、标准错误的内容保存到同一个文件中 |
实操:
① 将123 重定向输出到 mima.txt 文件中,然后将 mima.txt 的内容重定向输入给用户 zhangsan 的密码,从mima.txt 文件中取密码,需要注意SELinux 会影响此命令执行,若执行失败可尝试关闭SELinux(setenforce 0)
② 覆盖 > 和追加 >>
③ 输出错误信息
④ 混合输出
- 1>&2 把标准输出重定向到标准错误
- 2>&1 把标准错误重定向到标准输出
把标准输出,重定向到错误输出里面
把错误输出重定向到标准输出里面
2.多行重定向
可以帮助脚本开发人员不必使用临时文件来构建输入信息, 而是直接就地生产出一个文件并用作命令的标准输入。
EOF 也可以用其它字母,只要求一样就可以
3.管道
管道操作符:“|” 将管道符号“|"左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道.
四. Shell脚本变量
1 shell 变量的作用
用来存放系统和用户需要使用的特定参数(值)
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化
2. shell 变量的类型
-
自定义变量:由用户自己定义、修改和使用;
-
特殊变量:环境变量,只读变量,位置变量,预定义变量
2.1 自定义变量
① 定义新的变量
格式:变量名=变量值
② 查看定义的变量的值
格式:echo $变量名
③ 取消变量
格式:echo 变量名
④ 追加变量
格式:变量名+=追加值
临时添加变量
永久添加需要写入 /etc/profile
2.2 特殊符号
双引号 | 弱引用 可以识别变量 |
单引号 | 强引用 不能识别变量 |
{ } | 定义变量名的范围 |
`` 反撇 | 调用命令的执行结果与 $() 功能一样 |
2.3 变量的命名要求
-
区分大小写
-
不能使程序中的保留字和内置变量:如:if, for,hostname ,test
-
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
-
不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
-
大驼峰 StudentFirstName
-
小驼峰 studentFirstName
-
下划线 student_name
2.4 read -p
交互式的输入变量值,然后使用变量
2.5 export 变量作用范围
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。
可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用
格式:
export 变量名
export 变量名=变量值
这时候我们需要用到 export ,将局部变量变成全局变量
方式一:
方式二:
2.6 expr 整数变量的运算
运算符: + 加法 、 - 减法 、 \* 乘法 、 / 除法 、 % 取余
常见的表达式:
(1)expr 变量1 运算符 变量2
(2) let var=算术表达式
(3) ((var=算术表达式))
(4) var= $[算术表达式]
(5) var= `expr 算术表达式 `
(6) echo '算术表达式' | bc
这些操作都是一个意思的不同表达方式:
2.7 随机数生成器
random 随机数 取值范围:0~32767
制作一个学号点名器
假如班上有50名学生
2.8 颜色生成
echo -e 启用下列反斜杠转义的解释
随机生成颜色
2.9 提取系统信息脚本
#! /bin/bash
host=`ifconfig ens33|grep netmask|tr -s " "|cut -d" " -f3`
name=`hostname`
cpu=`lscpu|grep 型号名称|tr -s " "|cut -d" " -f2-8`
k=`uname -r`
os=`cat /etc/redhat-release`
disk=`lsblk|grep disk|tr -s " "|cut -d" " -f4`
mem=`free -h|grep Mem|awk '{print $2}'`
echo -e "\E[1;35m------------------------system info -------------------------\E[0m"
echo "主机名: $name"
echo "ip地址: $host"
echo "cpu型号: $cpu"
echo "内核版本: $k"
echo "系统类型: $os"
echo "磁盘大小: $disk"
echo "内存大小: $mem"
echo -e "\E[1;35m----------------------- end ------------------------------\E[0m"
3. 特殊的shell变量
3.1 环境变量
由系统提前创建,用来设置用户的工作环境
可以使用env查看环境变量
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
配置文件:
/etc/profile(全局生效)作用于所有用户
~/.bash_profile(当前用户环境)用户独立的配置文件,修改这个文件只作用于当前用户,可以用来长期变更或设置环境变量
给PATH可执行程序的默认搜索路径里面添加一个路径
将自建路径添加到默认可执行程序里面,并且给他赋于执行权限,这样不再需要输入绝对路径了
3.2 只读变量
readonly
命令用于定义只读shell变量和shell函数,readonly
命令的选项-p
可以输出显示系统中所有定义的只读变量。
重启 shell 环境可以取消
3.3 位置变量
-
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
-
$n:n为数字,$0代表命令本身,1~9代表第一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为 ${10}
10以上需要加 { }
3.4 预定义变量
$* | 表示所有位置参数的内容看成一个整体返回 返回所有 |
$@ | 表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有 |
$? | 表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常 |
$# | 表示命令行中位置参数的总个数 |
$$ | 当前bash的进程id |
$! | 后台任务最后一个id |
$0 | 表示当前执行的脚本或程序的名称 当前脚本的名字 |
$? 表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
$0 表示当前执行的脚本或程序的名称 当前脚本的名字
$$ 当前bash的进程id
$# 表示命令行中位置参数的总个数
区别:$*和$@
$* 1-26 当成一个整体
$@ 1-26 $1-$26独立的个体