目录
什么是 shell
shell 的两种面向对象
shell 脚本概述
脚本 (本质为程序)
脚本的组成
执行脚本
例题
脚本构成
脚本执行逻辑及执行方式
脚本的常见错误
编写 shell 脚本
执行脚本文件的方式
重定向
重定向操作
shell 变量的作用及类型
变量的作用
变量的类型
变量的使用方式
自定义变量
命名要求
特殊符号
环境变量
示例
只读变量
位置变量
预定义(状态)变量
整数的运算环境
expr ,命令
脚本举例
简单的计算器脚本
显示五大性能脚本
磁盘分区的脚本
本地搭建 yum 仓库脚本
脚本补充命令
set -e
set -u
| (管道符)
|xargs
echo $?
read
什么是 shell
—— 是一个命令解释器,它在操作系统的最外层,负责直接与用户进行对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出到屏幕反馈给用户;这种对话方式可以是交互的也可以是非交互的,我们所输入的命令计算机是不识别的,这时就需要一种程序来帮助我们进行翻译,变成计算机能识别的二进制程序,同时又把计算机生成的结果返回给我们
shell 的两种面向对象
—— 面向过程语言
-
开发的时候,需要一步一步执行
-
做一件事情,排出个步骤
-
问题规模小,可以步骤化,按部就班处理
-
以指令为中心,数据服务于指令
-
C 、shell
—— 面向对象语言
-
开发的时候将任务当成一个整体
-
一种认识世界、分析世界的方法论,将万事万物抽象为各种对象
-
将编程看成是一个事物,对外界来说,事物是直接使用的,不用关心事情内部的情况,而编程就是设置事物能够完成功能
-
类是抽象的概念,是万事万物的抽象,是一类事物的共同特征的集合
-
对象是类的具象,是一个实体
-
问题规模大,复杂系统
-
以数据为中心,指令服务于数据
-
java 、python 、golang 等 云 go k8个字母s 平台
shell 脚本概述
—— shell 脚本的概念
-
将要执行的命令按顺序保存到一个文本文件
-
给该文件可执行权限
-
可结合各种 shell 控制语句以完成更复杂的操作
—— shell 脚本应用场景
-
重复性操作
-
交互性任务
-
批量事务处理
-
服务运行状态监控
-
定时任务执行
脚本 (本质为程序)
—— 如果以 .sh 为结尾,会显示高亮,否则视为普通文件
脚本的组成
-
声明解释器
-
注释信息
-
执行命令
#!/bin/bash #声明解释器,代表接下来使用什么解释器来解释接下来的命令
#命令内容
执行脚本
-
直接调用 shell 解释器,加上脚本的名字
—— 格式:bash 脚本名 ;不需要加上权限
-
路径/脚本
—— 路径:绝对路径;需要权限
-
source (或 .)脚本名
—— 不建议使用,不需要权限,会修改目前的环境内容,会有一些问题
—— source 文件名 参数:会直接修改 bash 环境
如果想让脚本全局运行(Tab 键补全),将脚本放入 $PATH 路径下,并且脚本要有执行权限
例题
为什么命令可以补全
—— 运行权限
脚本构成
-
脚本申明(解释器):第一行开头 “#!/bin/bash” ,表示此行以下的代码语句是通过 /bin/bash 程序来解释执行,#!/bin/bash 为默认的解释器还有其它类型解释器 #!/bin/python #!/bin/pxpect
-
注释信息:以 # 开头的语句表示为注释信息
-
可执行语句:比如 echo 命令用于输出 " " 之间的字符串
脚本执行逻辑及执行方式
脚本执行逻辑
-
顺序执行:程序按从上到下顺序执行
-
选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
-
循环执行:程序执行过程中需要重复执行多次某段语句
脚本的常见错误
-
命令错误:不影响接下来的命令执行,但是本条命令不执行
—— bash -x 脚本名 :模拟执行后发现错误
-
语法错误:直接影响脚本无法正常运行
—— bash -n 脚本名:检查语法错误
-
逻辑错误
常见错误的区别
-
语法错误:会导致后续的命令不继续执行,可以用 bash -n 检查错误,提示的出错行数不一定是准确的
-
命令错误:默认后续的命令还会继续执行,用 bash -n 无法检查出来,可以使用 bash -x 进行观察
-
逻辑错误:只能使用 bash -x 进行
编写 shell 脚本
执行脚本文件的方式
-
脚本文件路径(绝对路径与相对路径;必须要有 x 权限)
-
格式:sh 脚本文件路径
-
格式:source 脚本文件路径(也可以通过 . 来执行)
重定向
—— 改变电脑数据的输出方向(默认电脑数据的输出方向是屏幕)
解释
—— 发了一条指令给电脑操作,电脑会回复结果一定会显示在屏幕上,称为:标准输出
如果电脑没有正确回复,称为:错误输出
通过键鼠、扫描仪、话筒等设备输入给电脑的指令,称为:标准输入
—— 改变输出方向
-
输出到别的终端设备
-
输出到文件中
类型 | 解释 |
---|---|
标准输出(STDOUT) | 默认的设备为显示器,文件编号为 1 ,命令将执行后的输出结果发送到标准输出文件 |
标准错误(STDERR) | 默认的设备为显示器,文件编号为 2 ,命令将执行期间的各种错误信息发送到标准错误文件 |
标准输入(STDIN) | 默认的设备为键鼠,文件编号为 0 ,命令将从标准输入文件中读取在执行过程中需要的输入数据 |
重定向操作
类型 | 操作符 | 作用 |
---|---|---|
重定向输入 | < 或 > | 从指定的文件读取数据,而不是从键鼠输入 |
重定向输入 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | 将错误信息追加到指定的文件中 | |
混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
shell 变量的作用及类型
变量的作用
-
用来存放系统和用户需要使用的特定参数(值)
—— 变量名:使用固定的名称,由系统预设或用户定义
—— 变量值:能够根据用户设置、系统环境的变化而变化
变量的类型
-
自定义变量:由用户自己定义、修改和使用
-
预定义变量:$? 、$$ 、$* 、$@ ,shell 程序中自带的
-
环境变量 :env 看到所有环境的变量
-
只读变量 :只可以读不可以改
-
位置变量 :$1 、$2、……、$n
含义
变量:值可以变化的
常量:值不可以变化
shell 不分数据类型,所有的数类型都是字符串
变量的使用方式
要求 | 方式 |
---|---|
设置变量 | 变量名=变量值,两边没有空格 |
调用变量 | echo $变量名 |
删除变量 | unset 变量名 |
重新定义变量 | 变量名=变量值 |
追加变量值 | 变量名+=变量值 |
自定义变量
—— 默认情况下,新定义的变量只在当前的 shell 环境中有效,因此称为局部变量;当进入子程序或新的子 shell 环境时局部变量将无法再使用
—— 可以通过内部命令 export 将指定的变量导出为全局变量,使用户定义的变量在所有的子 shell环境中能够继续使用
格式:export 变量名
系统内置变量:PATH、UID、HOSTNAME、USER
命名要求
-
区分大小写
-
不能使程序中的保留字和内置变量:如: if, for, hostname
-
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “-",和主机名相反
-
不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
-
驼峰 :StudentFirstName
-
小驼峰 :studentFirstName
-
下划线 :student_name
特殊符号
-
${} 定义的变量名的范围;用 ${ } 一定不会错
-
" " (英文)变量在双引号中可以识别,弱识别
-
' ' (英文)变量在单引号中不被识别,强识别
-
``(英文)反撇号代表引用命令执行的结果,用于命令的替换,效果等于 $( )
环境变量
-
由系统提前创建,用来设置用户的工作环境
-
可以使用 env 命令查看环境变量
-
需要记住的常用环境变量
-
配置文件:/etc/profile(全局生效);~/.bash_profile(当前用户环境)
选项 | 解释 |
---|---|
$USER | 表示用户名称 |
$HOME | 表示用户的宿主目录 |
$LANG | 表示语言和字符集 |
$PWD | 表示当前所在工作目录 |
$PATH | 表示可执行用户程序的默认路径 |
示例
将文件所在目录添加路径,可以执行脚本
echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/data chmod +x 脚本名 直接输脚本名,可以执行
只读变量
—— 格式:readonly 选项 参数
-
readonly 命令用于定义只读 shell 变量和 shell 函数
-
readonly -p :可以输出显示系统中所有定义的只读变量
-
变量值不允许修改(重新赋值)的情况
-
无法使用 unset 删除
-
最快方法重启
位置变量
—— 使用 $1 、$2、……等表示
位置参数 | 含义 |
---|---|
echo "$1" | 位置 1 |
echo "${10}" | 位置 10;10 以上的参数需要 {} |
echo "$*" | 将所有项当成一个值 |
echo "$@" | 所有项 |
echo "$0" | 脚本本身 |
echo "$#" | 后面参数的个数 |
预定义(状态)变量
预定义 | 作用 |
---|---|
$? | 代表上一次命令的执行结果是否正确;0 代表正确,反之为错误 |
$0 | 代表脚本的文件名字 |
$$ | 当前 bash 的 pid |
$# | 代表位置参数的总个数 |
$* | 代表返回所有参数,所有参数当成一个整体返回 |
$@ | 代表返回所有参数,每一个参数都是一个独立的个体返回 |
$! | 后台任务最后一个 id |
整数的运算环境
expr ,命令
—— 计算器
—— 格式:expr 变量1 运算符 变量2 [运算符 变量3]
运算符 | 作用 |
---|---|
+ | 加法 |
- | 减发 |
\ * | 乘法 |
/ | 除法 |
% | 取余数 |
++和-- | 增加和减少,可前置也可以放在结尾 |
let | 定义变量并将器初始化为一个值:例;expr let a=1+1—将结果存储在变量 a 中,echo $a —输出结果 |
脚本举例
简单的计算器脚本
#!/bin/bash read -p "数字1:" num1 #交互过程 read -p "数字2:" num2 #交互过程 expr $num1 + $num2 #计算,数字1加数字2
显示五大性能脚本
#!/bin/bash #删除空格 #只显示第三列空格也算一列 ip=`ifconfig ens32|grep netmask|tr -s " "|cut -d " " -f3` cpu=`lscpu |grep 型号名称|cut -d":" -f2|tr -s " "` mem=`free -h|grep Mem|tr -s " "|cut -d " " -f2` disk=`lsblk |grep disk|tr -s " "|cut -d" " -f4` echo "-------------------systeminfo---------------------" echo "ip地址 : ${ip}" echo "主机名 : $(hostname)" echo "系统版本: $(cat /etc/redhat-release)" echo "cpu型号 : $cpu" echo "内存大小: $mem" echo "磁盘大小: $disk" echo "--------------------------------------------------"
磁盘分区的脚本
#!/bin/bash read -p "分区的设备:" disk #交互过程 read -p "分区的大小:" num #交互过程 echo -e "n\n\n\n\n${num}\nw\n "|fdisk ${disk}
实验过程
本地搭建 yum 仓库脚本
#!/bin/bash mount /dev/sr0 /mnt cd /etc/yum.repos.d mkdir yuan mv *.repo yuan echo " [local] name=local baseurl=file:///mnt gpgcheck=0 " > local.repo yum clean all &>/dev/null #/dev/null 此为 Linux 的垃圾箱 yum makecache &>/dev/null yum install -y tree &>/dev/null #将下载产生的信息导入垃圾箱,就不会显示下载信息
脚本补充命令
set -e
—— 在脚本的前面输入该命令,一旦出错立即停止运行
set -u
—— 变量不存在不让执行
| (管道符)
—— 将第一个命令的结果当做后一个命令的处理对象
|xargs
—— 将上一个命令的结果翻译成标准输出结果作为下一个命令的处理对象
echo $?
—— 结果显示为 0 则正确,反之,错误
read
—— 用来提示用户输入信息,实现简单的交互过程
—— read -p :设置提示信息
read -t :输入等待时间(单位默认为秒)
例