shell脚本基础

接下来的博客会详细介绍一下shell脚本

知识要点
掌握Shell脚本的基础知识
学会使用Shell变量
学会编写简单的Shell脚本

什么是shell?
Shell是个程序(文本界面和图形界面,Linux默认的shell是bash),解析命令,通过shell与内核打交道。 shell又是命令语言,或者说是一种编程语言。Shell脚本其实就是shell程序,管理维护UNIX,Linux操作系统。

Shell脚本的应用环境
1.学习shell脚本的基本流程
看、想、写

2.shell脚本用在什么地方
编写常用系统维护工具菜单
重要的性能参数、进程和日志分析
自动实现数据备份计划
自动批量搭建特定系统环境
防火墙自动配置脚本
服务器的配置文件安全比对
对批量设备进行远程巡检

Shell脚本的组成元素
shell脚本的基本组成
声明和注释
系统命令
文本处理工具(grep、cut、sed、awk…)
各种变量
各种条件判断
循环结构语句
各种函数
Shell脚本的大体结构:第一部分(第一行):声明解析器(#!/bin/bash)
第二部分:脚本的说明信息:编写时间,作者,版本,功能,使用方法
第三部分:变量,函数
第四部分:主体部分,各种命令shell脚本基础
Shell的作用
Shell的作用 —— 命令解释器,“翻译官”
介于系统内核与用户之间,负责解释命令行shell脚本基础Shell的种类和切换
1.登录Shell
指用户每次登录系统后自动加载的Shell程序,大多数Linux系统采用 /bin/bash 作为默认登录Shell
/etc/shells 文件记录了系统支持的有效登录Shellshell脚本基础2.如何切换Shell环境
临时切换:直接执行其他Shell程序,例如ksh、zsh等
返回到原来的Shell环境时可以执行“exit”命令或者按Ctrl+D快捷键
更改用户登录Shell:
需修改 /etc/passwd 文件中用户记录的最后一个字段
或执行:usermod -s Shell程序路径 用户名
Shell初始化
bash初始化
登录shell
指的是输入用户名、密码, 从系统登录时执行的第一个程序

非登录shell
登录系统后, 在login shell里启动的shell是非login shell
如执行bash命令、在图形中打开终端均是开一个非登录shell

Bash初始化
1.bash的初始化脚本shell脚本基础bash启动时,会进行初始化,初始化就是执行一些脚本,有哪些脚本呢?
分2种情况:
第1种:登录时启动的bash,登录shell
初始化脚本执行顺序:/etc/profile->/etc/profile.d/*.sh->/.bash_profile->/.bashrc->/etc/bashrc
如果这些脚本中的变量发出冲突,那么以最后一个脚本的设置生效。

第2种:登录后,启动的bash,非登录shell
初始化脚本执行顺序:~/.bashrc->/etc/bashrc->/etc/profile.d/*.sh
注意:这些脚本中不要乱增加内容。例如:在脚本中增加echo
补充:/etc/rc.local是Linux开机会启动的脚本文件,
2.Shell启动配置文件的区别
/etc/profile:配置全局环境变量,影响所有用户
~/.bash_profile :配置个人环境,影响一个用户
/etc/bashrc :配置全局的别名或者shell选项,影响所有用户
~/.bashrc :配置个人别名或者shell选项,影响一个用户
补充:使用env命令可以查看全局变量

3.登录和非登录Shell区别
登录Shell负责系统全局环境初始化,会读取所有启动配置文件
非登录Shell默认会继承登录shell的环境变量,为了加快速度,无需读取所有启动配置文件,只需读取少量局部配置文件

4.退出登录Shell:~/.bash_logout

Bash的命令历史
1.命令历史
保存用户曾经执行过的命令操作
存放位置:~/.bash_history 文件

2.查看历史命令
使用↑、↓按键逐条翻看,允许编辑并重复执行 快捷键 ctrl +r(搜索字符)
执行:history
清除历史命令
执行:history -cshell脚本基础3.调用历史命令
!n:执行历史记录中的第n条命令
!str:执行历史记录中以“str”开头的命令(从下往上找)
!!:重复上一次的命令

4.设置记录历史命令的条数
修改 HISTSIZE 参数(默认为1000条,在初始化脚本里可以修改,也可以在最后生效的脚本里添加)shell脚本基础Bash的命令别名
1.命令别名
为使用频率较高的复杂命令行设置简短的调用名称
存放位置:~/.bashrc
2.查看命令别名
格式:alias [别名]
设置命令别名
执行:alias 别名=‘实际执行的命令’
取消已设置的命令别名
格式:unalias 别名
unalias -ashell脚本基础编写第一个shell脚本
1.编写脚本代码
方法一:使用vim文本编辑器
每行一条Linux命令,按执行顺序依次编写shell脚本基础方法二:用notepad++连接Linux写脚本
打开脚本文件后,要检查:文件格式,看右下角是不是UNIX; 文件编码是不是UTF-8;
2.赋予可执行权限
使脚本具有可执行属性shell脚本基础3.执行脚本文件 (重要)
方法一:脚本文件路径(要求文件有X权限)
方法二:bash 脚本文件路径
方法三:source 或者. 脚本文件路径
结论:前两种方法,会产生子进程(子bash进程),会被另一个启动的另一个bash解析。第三种方法不会产生子进程。那么脚本中的命令行就会在当前进程中(当前bash)解析和执行
Shell脚本,执行顺序是:从上往下,解析一行,执行一行shell脚本基础4.更完善的脚本构成
脚本声明
注释信息
可执行语句shell脚本基础Shell变量的作用,类型
1.变量的概念
变量是计算机程序中用来存储数据的比较抽象的概念。存在内存中。
引用变量就是取变量值 shell使用$来引用变量 例如:a=123 引用变量 $a $a就是123

2.变量的作用
为灵活管理Linux系统提供特定参数,有两层意思:
变量名:使用固定的名称,由系统预设或用户定义
变量值:能够根据用户设置、系统环境的变化而变化

3.变量的类型
自定义变量:由用户自己定义、修改和使用
环境变量:由系统维护,用于设置工作环境
位置变量:通过命令行给脚本程序传递参数
预定义变量:Bash中内置的一类变量,不能直接修改

4.按变量使用的范围
局部变量:只在当前的shell中有效
全局变量:子shell会从父shell继承的变量

自定义变量
1.定义新的变量
变量名要求以英文字母或下划线开头,不能以数字开头,区分大小写,约定俗成为大写,但不强制,变量名要有意义
等号两边不要空格 有空格用双引号
格式:变量名=变量值
2.查看变量的值
格式:echo ![](https://imgblog.csdnimg.cn/20190410212100842.png?xossprocess=image/watermark,typeZmFuZ3poZW5naGVpdGk,shadow10,textaHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMDI4MDU0,size16,colorFFFFFF,t70)3.线使变量名(引用变量当前是输出变量)![在这里插入图片描述](https://img-blog.****img.cn/20190410212100842.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzMDI4MDU0,size_16,color_FFFFFF,t_70)3.如果变量名容易和后边的字目和下划线连在一起导致混淆,则应该使用大括号将变量名括起来{变量名}shell脚本基础4.可以将命令的执行结果直接赋值给变量
var2=$( rpm -qf $(which fdisk) )
注:定义变量var2先引用which fdisk(查找绝对路径)的值在引用rpm -qf(找软件名)的值
$(命令)表示变量引用命令执行完后的数值

5.readonly可将变量设置为只读,变量一旦设置为只读,任何用户不能对此变量进行重新赋值
variable=value #先对一个变量进行赋值
readonly variable #将variable设为只读

6.利用unset命令可以清除变量的值,只读的变量不能清空
格式:unset 变量名

7.set命令可以查看当前有哪些变量

Shell命令行替换
bash shell 在解释命令前替换某些命令行元字符
统配符替换:(表示任意符号,任意个数)、?(表示一个个数)、[a-z](表示一个范围里面任意一个) //例如表示两个字母开头的文件可以用[a-z][a-z]
历史命令替换:!!(调用上一个历史命令)、!n、!str(调用str开头的历史命令)
代字号替换:(当前用户的家目录)、用户名(指定用户的家目录)
变量替换:变量名、{变量名}
大括号替换:{a,b,c}file(表示afile bfile cfile)、{aa,bb}/{aa,bb}(表示aa/aa aa/bb bb/aa bb/bb四种组合)
算术替换:+、-、
、/

Shell中引号
1.引用和转义字符
使用特殊字符时,就是表示本身,不使用其特殊意义
\ :避免下一个字符被shell解释
双引号 “ ”:避免双引号内除了$、!和`(反引号)以外的其它字符被shell解释
单引号 ‘ ’:避免单引号内的任何字符被shell解释
反引号 ``:命令替换,提取命令执行后的输出结果,不能嵌套 $()可以嵌套
单引号、双引号、反引号的区别

2.shell替换发生在命令运行之前

实验案例一(Shell中引号知识)
编写脚本显示如下图所示结果,分析显示的结果shell脚本基础1.输出结果:My name is name2.Mynameishello3.Mynameisname 2.输出结果:My name is ‘hello’ 3.输出结果:My name is “name”
4.输出结果:My hello is hello //引号采用就近原则
5.输出结果:My KaTeX parse error: Unexpected character: '' at position 52: … //引号采用就近原则 ̲echo命令 1.echo命令…PS2(指定命令行的续行)shell脚本基础位置变量
位置变量
表示为 nn1 99n,n为1~9之间的数字 大于9的位置参数要用{},例如{10}shell脚本基础预环境变量
预定义变量
$#:命令行中位置变量的个数
$*:所有位置变量的内容(较少使用)
[email protected]:所有位置变量的内容
$0:当前执行的进程/程序名
shellPID,echo :当前shell的PID值, echo ; ps $,,, 常用作临时变量的后缀,PPID得到父进程的PID
?00//?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错。 //命令状态返回值,不是标准输出的,是用来判断命令是否执行成功的。通过?可以获取到上一条命令的状态返回值
RANDOMtouchabcRANDOM :随机数,可以作为临时文件名 touch abcRANDOM.txt

位置变量示例
对比*和@的区别shell脚本基础$*强调整体 [email protected]强调部分

返回值判断
有条件运行多个命令
cmd1 && cmd2 //命令1成功,命令2才执行(相当于并且)
cmd1成功了(返回值为0)才会运行cmd2
cmd1 || cmd2 //命令2失败,命令1才执行(相当与或者)
cmd1失败了(返回值为非0)才会运行cmd2shell脚本基础返回变量示例
备份脚本使用位置变量和预定义变量shell脚本基础Bash的重定向操作
改变标准输入、标准输出、标准错误的方向shell脚本基础Here Document用法
传递命令序列到程序shell脚本基础EOF是结束符,可以自定义
Here Documen示例
编写脚本自动创建mysql数据库,创建完毕显示结果shell脚本基础
总结:给脚本传入内容
1.read
2.位置参数
3.输入重定向
4.<<