目录
1.Shell脚本的概述
1.1 什么是Shell
1.2 shel脚本的概念
1.3.Shell脚本应用场景
1.4 Shell的作用
1.5 Shell脚本能干什么
2.Shell脚本的编程规范
2.1创建Shell脚本的思路
2.2编写Shell脚本
2.3.Shell脚本的执行逻辑和方法
2.4 脚本错误调试
2.5 命令echo
3.重定向与管道操作
3.1 重定向--交互式硬件设备
3.2 重定向--重定向操作
3.3 管道符号操作 “ | ”
4.shell变量的作用与类型
4.1 shell变量的介绍
4.2 变量的作用
4.3 变量的类型
5. 自定义变量
5.1 自定义变量命名要求
5.2 定义与查看变量
5.3 赋值时使用的引号
5.4 从键盘输入内容为变量赋值
5.5 变量的运算
6.环境变量
6.1常用的环境变量和注意事项
6.2 环境变量配置文件
6.3 设置变量的作用范围
7.只读变量
8.位置变量
9.预定义变量
1.Shell脚本的概述
1.1 什么是Shell
Shell是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户。这种对话方式可是交互也可以是非交互式的,我们所输入的命令计算机是不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们。
shell脚本就是说我们把原来 linux 命令或语句放在一个文件中,然后通过这个程序文件去执行时,我们就说这个程序为 shell 脚本或 shell 程序;我们可以在脚本中输入一系统的命令以及相关的语法语句组合,比如变量,流程控制语句等,把他们有机结合起来就形成了一个功能强大的 shell 脚本。
1.2 shel脚本的概念
1.将要执行的命令按顺序保存到一个文本文件;
2.给该文件可执行权限;
3.可结合各种Shell控制语句以完成更复杂的操作。
总结:Shell脚本就是将需要执行的命令保存到一个文件中,按照顺序执行,它不需要编译,它是解释型的。
1.3.Shell脚本应用场景
1.重复性操作;
2.交互性任务;
3.批量事务处理;
4.服务运行状态监控定;
5.时任务执行。
1.4 Shell的作用
之前我们提到过什么是Shell ——shell就相当于是个翻译官
1.Linux系统中的Shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
2.常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。
ps注意:1.nologin:奇怪的shell,这个shell可以让用户无法登录主机。
2.bash ( /bin/bash)是目前大多数Linux版本采用的默认Shell。
1.5 Shell脚本能干什么
1.自动化完成软件的安装部署,如安装部署LAMP架构服务
2.自动化完成系统的管理,如批量添加用户
3.自动化完成备份,如数据库定时备份
4.自动化的分析处理,如网站访问量
2.Shell脚本的编程规范
2.1创建Shell脚本的思路
1. 创建一个包含命令和控制结构的文件;
2. 修改这个文件的权限使它可以执行 (# 使用 chmod +x first.sh);
3. 检测语法错误 (set -x 追踪脚本是否有故障);
4. 执行 ./first.sh 。
2.2编写Shell脚本
1.编写脚本代码;
2.使用vim文本编辑器;
3.每一行条Linux命令,按执行顺序依次编写;
4.赋予可执行的权限。
2.3.Shell脚本的执行逻辑和方法
1.脚本执行逻辑
顺序执行:程序按从上到下顺序执行;
选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行;
循环执行:程序执行过程中需要重复执行多次某段语句。
2. 方法一:脚本文件路径(绝对路径和相对路径,必须有x权限)
相对路径:
绝对路径:
方法二:sh脚本文件路径
相对路径:
绝对路径:
方法三:source 脚本文件路径
相对路径:
绝对路径:
方法四:sh < lhf.sh 或者 cat lhf.sh |sh(bash)
2.4 脚本错误调试
1.脚本错误种类
(1)命令错误:命令出错不会影响接下来的命令继续;
(2)语法错误:会影响接下来的命令继续;
(3)逻辑错误:只能自己去筛查代码的正确。
2.检查脚本错误
(1)检查语法错误:bash -n 脚本名称 (不在当前目录下加绝对路径);
(2)检查逻辑错误:bash -x 脚本名称 (不在当前目录下加绝对路径)。
3.总结:脚本错误常见的有三种区别
(1)语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的;
(2)命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察;
(3)逻辑错误,只能使用 bash -x 进行。
2.5 命令echo
选项 | 作用 |
-n | 不追加换行 |
-e | \b 退格 |
\c 抑制更多的输出 | |
\n 换行 | |
\t 横向制表符 | |
\v 纵向制表符 |
1.echo -n 不追加换行
2.echo -e \b 退格
3.echo -e \c 抑制更多的输出
4.echo -e \n 换行
5. echo -e \t 横向制表符
6.echo -e \v 纵向制表符
3.重定向与管道操作
3.1 重定向--交互式硬件设备
1.标准输入:从该设备接收用户输入的数据;
2.标准输出:通过该设备向用户输出数据;
3.标准错误:通过该设备报告执行出错信息。
类型 | 设备文件 | 文件描述编号 | 默认设备 |
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
3.2 重定向--重定向操作
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定文件读取数据,而不是从键盘输入。 |
重定向输出 | > | 将输出结果保存到指定文件(覆盖原有内容)。 |
>> | 将输出结果追加到指定文件尾部。 | |
标准错误输出 | 2> | 将错误信息保存带指定文件(覆盖原有内容)。 |
2>> | 将错误信息追加到指定文件。 | |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中。 |
1. 定向输出
重定向输出指的是将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上。重定向输出使用">或">>"操作符号,分别用于覆盖或追加文件,若重定向输出的目标文件不存在,则会新建该文件,然后将前面命令的输出结果保存到该文件中﹔若目标文件已经存在,则将输出结果覆盖或追加到文件中。
2. 定向输入
3.重定向标准错误
错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指 定的文件,而不是直接显示在屏幕上。错误重定向使用“2>”操作符。
两个作用:
在实际应用中,错误重定向可用来收集程序执行的错误信息,为排错提供依据;
还可以将无关紧要的错误信息重定向到空文件/dev/null 中,以保持脚本输出的简洁。
黑洞命令:
3.3 管道符号操作 “ | ”
将管道符号 “|” 左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
1. 使用管道符修改密码
2.打印出用户中可以登录shell的用户名,家目录,及登录shell
cat /etc/passwd | grep "nologin" | awk -F: '{print $1,$6,$7}' ;
或者grep "/nologin$" /etc/passwd | awk -F: '{print $1,$6,$7}' 。
4.shell变量的作用与类型
4.1 shell变量的介绍
变量是计算机语言中能储存计算结果或能表示值的抽象概念。保存将来会变化的数据,即使数据变化,直接调用变量即可。
Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。
4.2 变量的作用
用来存放系统和用户需要使用的特定参数(值)
(1)变量名:使用固定的名称,由系统预设或用户定义;
(2)变量值:能够根据用户设置、系统环境的变化而变化。
4.3 变量的类型
1.自定义变量:由用户自己定义、修改和使用;
2.特殊变量:环境变量,只读变量,位置变量,预定义变量。
(1)环境变量:由系统维护,用于设置工作环境;
(2)只读变量:只可以读取不可以更改;
(3)位置变量:通过命令行给脚本传递参数;
(4)预定义变量:Bash中内置的一类变量,不能修改。有些规定好的变量 放在那里让你使用。
5. 自定义变量
5.1 自定义变量命名要求
(1)区分大小写;
(2)不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=;
(3)只能使用数字、字母及下划线,且不能以数字开头;
(4)不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH;
(5)大驼峰 Li Hong Fei;
(6)小驼峰 li Hong Fei;
(7)下划线 li_hong fei;
5.2 定义与查看变量
1.定义变量
变量名以字母或下划线开头,区分大小写,建议全大写。
变量名=变量值
2.查看变量值
echo $变量名
使用大括号{}定义变量的范围,将变量名分隔出来
删除变量unset
5.3 赋值时使用的引号
1. 双引号" ":允许通过$符号引用其他变量值;
2. 单引号' ':禁止引用其他变量值,$视为普通字符;
3. 反撇号``:命令替换,提取命令执行后的输出结果与$( )效果相同;
4. {}可以分隔变量值;
5. 定义变量时中间有特殊字符时 比如空格 用单引号或者双引号括起来.
(1) 双引号与单引号
(2)定义变量时中间有特殊字符
(3)反撇号与$()
(4) echo选项
echo -n 表示不换行输出
使用echo -e输出转义字符,将转义后的内容输出到屏幕上
常用的字符:
\c 不换行输出,在”\c”后面不存在字符的情况下,作用相当于echo -n
\n 换行
\t 转义后表示插入tab,即制表符【相当于每个字符与字符之前会有空四个字符】
5.4 从键盘输入内容为变量赋值
格式:read 变量名
1. read -p "提示内容" 变量名
2.read 变量名
5.5 变量的运算
1.整数变量的运算
shell默认只支持整数的运算
运算符:+ 加法
、- 减法
、* 乘法
、/除法
、% 取余
格式:expr 变量1 运算符 变量2 [运算符 变量3](计算乘法时,需要使用“\”转义符)
var=$ ( expr变量1运算符变量2)
var=$((变量1 运算符 变量2))
var=$[ 变量1 运算符 变量2 ]
let var=变量1 运算符 变量2
let i++ i=$[$i+1]
let i-- i=$[$i-1]
let i+=2 i=$[$i+2]
let i/=2 i=$[$i/2]
2.浮点数运算
使用bc计算器
echo "浮点运算字符串" | bc
echo "scale=小数位数;浮点运算字符串" | bc
使用awk
awk 'BEGIN {print 浮点运算字符串}'
6.环境变量
6.1常用的环境变量和注意事项
1. 使用env查看环境变量
2.常用环境变量
(1)$USER 表示用户名称;
(2)$HOME 表示用户的宿主目录;
(3)$LANG 表示语言和字符集;
(4)$PWD 表示当前所在工作目录;
(5)$PATH 表示可执行用户程序的默认路径。
3.注意事项
(1)可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
(2)一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
(3)一般只在系统配置文件中使用,在脚本中较少使用
6.2 环境变量配置文件
四个系统级的环境配置变量/etc/profile /etc/bashrc 或者(自己家目录的)/root/.bash_profile/ root/.bashrc .bash_profile /root/.bashrc
1. /etc/profile
系统每次启动都会自动执行 /etc/profile 文件里的命令,这个文件是对全局有效的(所有的shell环境和用户);
2. ~/.bash_profile ~/.bashrc
不同用户登录系统 会自动执行 自己家目录中的 ~/.bash_profile 文件中的命令,自动执行 ~/.bashrc ~/.bashrc 当前用户每切换一个shell环境都会自动执行;
3./etc/bashrc
/etc/bashrc 针对所有用户的,用户每切换一个shell环境都会自动执行。
6.3 设置变量的作用范围
1.export命令
默认情况下,新定义的变量只在当前的shell环境中有效,因此称为局部变量,当进入子程序或新的shell环境中,局部变量将无法再起作用。可以通过内部命令export将指定的变量为全局变量,使用户定义的变量在所子shell环境中可以继续使用。
export 变量名
export 变量名=变量值
2. 将变量名添加进配置文件/etc/profile
(1)子进程中定义一个变量 退出子进程当前环境,回到父进程变量值不存在
2.换个终端打开shell
终端1
[root@localhost ~]# export k=key
[root@localhost ~]# echo $k
key
终端2
[root@localhost ~]# echo $k
##没有任何输出
[root@localhost ~]#
所以,在子进程中定义一个变量 退出子进程当前环境 export变量就会自动消失,换个终端打开shell定义的全局变量 export也会消失所以定义全局变量时通常加入 配置文件/etc/profile
使用export全局变量,将export放入/etc/profile
[root@localhost ~]#vim/etc/profile
---------------------------
export number=11
[root@localhost ~]#source /etc/profile ##刷新配置文件
[root@localhost ~]#echo $number
11
7.只读变量
变量值不允许修改(重新赋值)的情况
无法使用 unset 删除
最快方法重启
8.位置变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 、${10}表示
$10:表示位置变量$1后面跟着0
9.预定义变量
1.$0 : 代表脚本本身;
2.$# : 代表脚本后面跟的参数(位置变量)的个数;
3.$* : 不加双引号的话 $* 和$@都代表脚本后面跟的所有参数,加上双引号 "$*" 会把所有参数当做一个整体的参数(此时参数数量为1)去看待;
4.$@ : 加上双引号 "$@" 会把脚本后面跟的每一个参数当做一个个体去看待;
5.$? :代表上一条命令或者脚本执行后返回的状态码,返回值为0表示执行正确,为非0值表示执行异常 还可以在return 退出函数时获取的返回值(0-255,超过部分 %256 取余);
6.$$:代表当前进程。
(1)$0脚本本身
(2)$?上一条命令或者脚本执行后返回的状态码
(3)$#脚本后面跟的参数(位置变量)的个数