1.认识shell脚本
1.1 Shell脚本概述
- Shell脚本的概念
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种Shell控制语句以完成更复杂的操作
- Shell脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
1.2 Shell的作用
- Shell的作用---解释器,“翻译官”
于操作系统内核与用户之间,充当了一个“命令解释器"的角色,负责接收用户输入的操作指令(命令)并进行解释,Shell告诉操作系统的内核用户希望做什么,内核在通过cpu调度、内存管理、磁盘输入输出调动硬件。
Shell是个面向字符中的编程语言,可以跟Python之类的其他语言配合起来,比如某个复杂的功能使用一个Python脚本来实现, 然后在shell中调用这个脚本实现较复杂的功能:或者反过来,在Python脚本中调用外部的Shell脚木来提高自动化的效率,也是可以的。
- 自动化运维
- 批最化重复操作可以编写脚本结合计划任务自动周期运行
- 减轻管理员工作量
- 提高处理文本文件的速度
- 避免配置出错
- 用户的登录Shell
- 登录后默认使用的Shell程序,一般为/bin/bash
- 不同 Shell的内部指令、运行环境等会有所区别
1.2.1 Linux中有哪些shell?
检查一下/etc/shell文件,里面就是Linux所包含的Shell.
最常用的就是
bash、tcsh、 cah、sh、nologin这些shell.这些shell都是依据linux发展者的不同所>创造出的不同版木。
- bash:基准于GNU的框架下发展出的Shell。
- csh:语法有点类似于c语言的Shell。
- tcsh:整合了csh,提供更多的功能。
- sh:已经被bash所替换。
- nologin:奇怪的shell,这个shell可以让用户无法登录主机。
注: bash (/bin/bash) 是目前大多数Linux版本采用的默认Shell
1.2.2 为什么系统上合法的Shell要写入/etc/shells这个文件呢?
这是因为系统某些服务运行过程中,会去检查用户能够使用的shell,而这些shell的查询就是借由/etc/shells这个文件。
1.2.3 用户什么时候可以取得shell工作?用户默认会取得哪一个shell?
当用户登录的时候,系统就会给一个shell让我来用。而这个登录取得的shell就记录在/etc/passwd这个文件内。
1.3 Shell编程规范
1.3.1 shell脚本的构成
-
脚本申明(解释器):若第一行为"!/bin/bash". 表示此行以下的代码语句是通过/bin/bash程序来解释执行,#!/bin/bash为默认解释器。还有其它类型的解释器,比如#!/usr/bin/python、#!/usr/bin/expect。 -
注释信息:以开头的语句表示为注释信息,被注释的语句在运行脚本时不会被执行。 -
可执行语句:比如echo命令, 用于输出" "之间的字符申
1.3.2 编写第一个shell脚本
[root@localhost ~]# vim /root/test.sh
#!/bin/bash //申明解释器
#This is my first Shell-Script //脚本注释信息
cad /boot //以下是代码块
echo"当前的目录位于:”
pwd
echo "其中以vml开头的文件包括:"
ls -lh vml*
1.3.3 Shell脚本的执行
- 方法一:指定路径的命令,要求文件必须有x权限。
chmod +x /root/test.sh
指定绝对路径: /root/test.sh
指定相对路径: ./test.sh
- 方法二:指定shell来解释脚木,不要求文件必须有x权限。
bash或sh脚本路径:
sh test.sh、bash test.shsource或 . 脚木路径:
. test.sh 、source test.sh
1.4 重定向
- 交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
| 类型设备 | 文件 | 文件描述编号 | 默认设备 |
|---|---|---|---|
| 标准输入 | /dev/stdin | 0 | 键盘 |
| 标准输出 | /dev/stdout | 1 | 显示器 |
| 标准错误输出 | dev/stderr | 2 | 显示器 |
- 重定向操作
| 类型 | 操作符 | 用途 |
|---|---|---|
| 重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
| 重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
| 重定向输出 | >> | 将输出结果追加到指定的文件尾部 |
| 标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
| 标准错误输出 | 2>> | 将错误信息追加到指定的文件中 |
| 混合输出 | &> | 将标准输出、标准错误的内容保存到同一个文件中 |
| 混合输出 | 2>&1 | 将标准错误输出重定向到标准输出 |
[root@localhost ~]# echo "123456" > pass.txt
[root@localhost ~]# passwd --stdin zhangsan < pass.txt #从pass.txt 文件中取密码,需要注意SELinux 会影响此命令执行,若执行失败可尝试关闭SELinux
ls -lh > log.txt 2>&1 `等同于` 1s -lh &> log.txt
本来1-->屏幕 (1指向屏幕)
执行>1og后,1-->1og.txt(1指向log.txt)
执行2>&1后,2-->1 (2指向1,而1指向log.txt,因此2也指向了log.txt)
1.5 管道操作
将管道符号"|"左侧的命令输出的结果,作为右侧命令的输入(处理对象),同一行命令中可以使用多个管道。
[root@localhost ~]# ps aux | wc -l
[root@localhost ~]# echo "abc123" | passwd --stdin zhangsan
2. Shell脚本变量
2.1 变量的作用、类型
2.1.1 变量的作用
用来存放系统和用户需要使用的特定参数(值)
- 变量名:使用固定的名称,由系统预设或用户定义
- 变量值:能够根据用户设置、系统环境的变化而变化
2.1.2 变量的类型
- 自定义变量
- 由用户自己定义:修改和使用
- 特殊交量
- 环境变量
- 只读变量
- 位置变量
- 预定义变量
2.2 自定义变量
- 定义一个新的变量
- 变量名以字母或下划线开头,区分大小写,建议主大写
变量名=变最值
- 查看变量的值
echo $变量名
[root@localhost ~]# name=can
[root@localhost ~]# echo $name
2.2.1 read命令输入内容
- 方法一
read -p "提示信息" 变量名
echo $变量名
[root@localhost ~]# read -p "请输入一个变量的值:" name
[root@localhost ~]# echo $name
- 方法二
echo -n "提示信息"。
read 变量名
echo $变量名
2.2.2 整数变量的运算
- 常用运算符
| 方法 | 符号 |
|---|---|
| 加法运算 | + |
| 减法运算 | - |
| 乘法运算 | \* |
| 除法运算 | / |
- 整数运算
expr 变量1 运算符 变量2 [运算符变量3]....
2.
$((变量1 运算符 变量2))
3.
$[变量1 运算符 变量2]
4.
let 变量名=变量1 运算符 变量2
echo $变量名
i++ 相当于 i-$[$i+1]
i-- 相当于 i-$[$i-1]
i+=2 相当于 i=$[$i+2]
- 浮点数运算
echo "浮点数 运算符 浮点数" | bc
awk 'BEGIN {print 浮点数 运算符 浮点数 }'
2.3 特殊变量
由用户自己定义、修改和使用
2.3.1 环境变量
环境变量由系统提前创建,用来设置用户的工作环境,使用env命令可以查看到当前工作环境下的环境变量
USER 表示用户名称
HOME 表示用户的宿主目录
LANG 表示语言和字符集
PWD 表示当前所在的工作目录
PATH 表示可执行程序的默认搜索路径
[root@localhost ~]# echo $PATH #查看当前搜索路径
[root@localhost ~]# PATH="$PATH:/root" #将/root目录添加到搜索路径
[root@localhost ~]# export PATH="$PATH:/root" #输出为全局环境变量
[root@localhost ~]# source /etc/profile #读取并执行文件中的设置
环境变量的全局配置文件为/etc/profile,在此文件中定义的变量作用于所有用户。每个用户还有自己的独立配置文件(~/.bash_profile) 。可以用来长期变更或设置某个环境变量。
[root@localhost ~]# vim /root/.bash_profile
export HISTSIZE=200 #修改root用户的历史命令记录条数
2.3.2 只读变量
- readonly命令设置只读变量
[root@localhost ~]# product = benet
[root@localhost ~]# readonly product #设置为只读变量
[root@localhost ~]# product=accp #只读变量不可以被重新赋值
[root@localhost ~]# unset product #`只读变量不可以被删除,unset命令用于删除变量`
2.3.3 位置变量
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字行串参数按照从左到右的顺序依次赋值给位置变量。
$n:n为数字,$0代表命令本身,$1-$9代表带个到第九个参数
`十以上的参数需要使用大括号表示,比如第十个多数为${10}`
[root@localhost ~]# vim addnum.sh
num1=$1
num2=$2
sum=$(($num1 + $num2) )
echo $sum
[root@localhost ~]# ./addnum.sh 1234 10 20
2.3.4 预定义变量
$*、$@:表示命令或脚本要处理的参数。
区别:
"$*":把所有参数看成以空格分隔的一个字符串整体(单字符串)返回,代表"$1 $2 $3 $4"。
"$@":把各个参数加上双引号分隔成n份的参数列表,每个参数作为一个字符串返回, 代表"$1" "$2" "$3" "$4"。
$0:表示当前执行的脚本或命令的名称。
$#:表示命令或脚本要处理的参数的个数。
$?:表示前一条命令或脚本执行后的返回状态码,返回值为0表示执行正确,返回任何非0值均表示执行出现异常。也常被用于Shell脚本中return退出函数并返回的退出值。
[root@localhost ~]#vim mybak.sh
#!/bin/bash
time=backup-`date +%F`.tar.gz
tar zcf $time $* &> /dev/null #/`dev/nul1表示的是一个黑洞文件,通常用于丢弃不需要的数据输出`
echo "已执行$0脚本"
echo "共完成$#个对象的备份"
echo "具体内容包括: $*"
[root@localhost ~]# chmod +x mybak.sh
[root@localhost ~]# ./mybak.sh /etc/passwd /etc/shadow