一,shell脚本编程规范
1,shell脚本的概念
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种shell控制语句以完成更复杂的操作
2,shell脚本的应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
3,什么是shell脚本?
简单地说,只要将平时使用的各种linux命令按顺序保存到一个文本文件中,然后添加可执行权限,这个文件就成为一个shell脚本了
4,shell脚本的作用
(1)shell相当于命令解释器,“翻译官”
- 介于系统内核与用户之间,负责解释命令行
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QESPOA57-1604968241632)(en-resource://database/853:1)]
(2)用户的登录shell
- 登录后默认使用的shell程序,一般为 /bin/bash
- 不同shell的内部指令,运行环境等会有所区别
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Y3dzpSV-1604968241635)(en-resource://database/855:1)]
(3)通过/etc/shells文件了解当前系统所支持的shell脚本种类
[root@server1 ~]# cat /etc/shells
/bin/sh
/bin/bash ### /bin/bash 目前为止大多数Liunx版本才用的默认shell脚本
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
[root@server1 ~]#
5,shell编程规范
(1)编写脚本代码
- 使用vim文本编辑器
- 每行一条linux命令,按执行顺序依次编写
[root@server3 ~]# vi first.sh
[root@server3 ~]# cat first.sh //以下为脚本编辑的内容
cd /boot/
pwd
ls -lh vml*
(2)赋予可执行权限
- 使脚本具有可执行属性
chmod +x first.sh
(3)执行脚本的三种方式
- 方法一: sh 脚本文件路径 (不需要执行权限也可操作))
[root@server3 ~]# sh first.sh
/boot
-rwxr-xr-x. 1 root root 5.7M 9月 8 02:47 vmlinuz-0-rescue-8a29d4d8924c41d79519fbb0048b74a6
-rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
- 方法二:./ 脚本文件路径 (需要执行权限来操作))
[root@server3 ~]# ./first.sh
bash: ./first.sh: 权限不够
[root@server3 ~]# chmod +x first.sh
[root@server3 ~]# ./first.sh
/boot
-rwxr-xr-x. 1 root root 5.7M 9月 8 02:47 vmlinuz-0-rescue-8a29d4d8924c41d79519fbb0048b74a6
-rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
- 方法三: source 脚本文件路径 (立马工作让环境生效,并且不需要执行权限 ,同时也会自动切入到脚本中的环境)也可以通过.来执行(注意用.来执行的时候要注意空格)
[root@server3 ~]# source first.sh
/boot
-rwxr-xr-x. 1 root root 5.7M 9月 8 02:47 vmlinuz-0-rescue-8a29d4d8924c41d79519fbb0048b74a6
-rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
[root@server3 boot]# pwd
/boot
[root@server3 boot]#
(4)一个更加完善的脚本构成
完善脚本构成的三大要素: 脚本声明, 注释信息 , 可执行语句
例如:
[root@server1 ~]# vim /first.sh //以下行为编辑的脚本内容
#!/bin/bash //指明运行的目录
# this is my first shell-script //关于脚本的说明情况
cd /boot
echo "当前的目录位于:“ //输出友好提示信息
pwd
echo "其中以vml开头的文件包括:“
ls -lh vml*
[root@server1 ~]# sh /first.sh 用sh来执行
当前的目录位于:“
pwd
echo 其中以vml开头的文件包括:“
-rwxr-xr-x. 1 root root 5.7M 9月 7 16:55 vmlinuz-0-rescue-99cd71752ccc4ea6ba5223666b42918b
-rwxr-xr-x. 1 root root 5.7M 8月 23 2017 vmlinuz-3.10.0-693.el7.x86_64
6,重定向与管道
(1)交互式硬件设备
- 标准输入: 从该设备接收用户输入的数据
- 标准输出 : 通过该设备向用户输出数据
- 标准错误 :通过该设备报告执行出错信息
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
(2)重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
重定向输出 | >> | 将输出结果追加到指定的文件尾部 |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
标准错误输出 | 2>> | 将错误信息追加到指定的文件中 |
混合输出 | &> | 将标准输出,标准错误的内容保存到同一个文件中 |
(3)关于错误重定向?
错误重定向指的是将执行命令过程中出现的错误信息(如选项或参数错误等)保存到指定的文件,而不是直接显示在屏幕上,错误重定向使用“2>”操作符,其中“2”是指错误文件的编号(在使用标准输出,标准输入重定向时,实际上省略了1,0编号)
在实际应用中,错误重定向可用来收集程序执行的错误信息,为拍错提供依据;对于shell脚本,还可以将无关紧要的错误信息重定向到空文件/dev/null 中,以保持脚本输出的简洁。将一些重要的执行程序的错误重定向到某个文件中。
使用“2>”操作符时,会像使用“>”操作符一样覆盖目标文件的内容,若要追加内容而不是覆盖文件,则应改用“2>>”操作符。也可以使用“&>”操作符将正确和错误两类输出信息信息保存到同一个文件。
(4) 管道操作符号“|”
将左侧的命令输出结果,作为右侧命令的处理对象
- 格式:cmd1 | cmd2 【… | cmdn】
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iP8rkr1G-1604968241637)(en-resource://database/865:1)]
二,shell脚本变量
变量的作用
用来存放系统和用户需要使用的特定参数(值)
-
变量名:使用固定的名称,由系统预设或用户定义
-
变量值 : 能够根据用户设置,系统环境的变化而变化
变量的类型
- 自定义变量:由用户自己定义,修改和使用
- 特殊变量:环境变量,只读变量,位置变量,预定义变量
1,自定义变量
定义一个新的变量
- 变量名以字母或下划线开头,区分大小写,建议全大写
格式: 变量名=变量值
查看变量的值
echo $变量名
例如:
[root@server2 ~]# Product=Python
[root@server2 ~]# Version=2.7.13
[root@server2 ~]# echo $Product
Python
[root@server2 ~]# echo $Product $Version
Python 2.7.13
[root@server2 ~]#
赋值时使用引号
- 双引号:允许通过$符号引用其他变量值
- 单引号:禁止引用其他变量值,$视为普通字符
- 反撇号: 命令替换,提取命令执行后的输出结果
从键盘输入内容为变量赋值
read [-p “提示信息"] 变量名
整数变量的运算
expr 变量1 运算符 变量2 [运算符 变量3]…
常用运算符
- 加法运算: +
- 减法运算: -
- 乘法运算: *
- 除法运算: /
- 求模(取余)运算:%
2,特殊变量
环境变量
- 由系统提前创建,用来设置用户的工作环境
- 配置文件: /etc/profile, ~/.bash_profile
常见环境变量
- PWD, PATH
- USER , SHELL, HOME
[root@server3 ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin
[root@server3 ~]# PATH="$PATH:/root"
[root@server3 ~]# echo $PATH
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:/root
[root@server3 ~]#