目录
Shell脚本的概念
将要执行的命令按顺序保存到一个文本文件
给该文件可执行权限
可结合各种Shell控制语句以完成更复杂的操作
Shell脚本应用场景
重复性操作
交互性任务
批量事务处理
服务运行状态监控
定时任务执行
shell的运行原理
人类写了一个命令集合,然后用bash ( shell)翻译给硬件,由硬件执行
脚本的构成
脚本声明(解释器):
第一行开头"#!/bin/bash"表示此行以下的代码语是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#! /bin/python、#! /bin/expect
注释信息:
以#开头的语句表示为注释信息,可写中文
可执行语句:
比如echo命令用于输出” “之间的字符串
执行脚本命令
直接调用shell解释器,加上脚本的名字:bash.脚本名,不需要加上权限
路径/脚本,路径:相对或绝对,shell本质上也是一个程序,需要权限
source:(.)脚本名,不建议使用,会直接修改当前bash环境
注意:1、2 种运行方式,是将程序加载到内存中运行,类似于另开一个运行的模块;3 运行方式会在当前环境下直接运行,会修改当前bash的内容
补充:如果想让脚本全局运行(补全),可以将脚本加入$PATH路径下,并且脚本必须有执行权限,执行命令:echo "$PATH"
脚本执行逻辑
顺序执行:程序按从上到下顺序执行
选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
循环执行:程序执行过程中需要重复执行多次某段语句
脚本运行错误类别
1、命令错误:
不会影响接下来的命令,但本条命令不执行
[root@localhost test1]#bash -x 脚本
#执行脚本,可以发现脚本错误[root@localhost test1]#vim test.sh
set -e
#加在脚本的第一行
#在执行过程中如果出现错误,立即停止执行2、语法错误:
直接影响脚本 无法正常运行
[root@localhost test1]#bash -n 脚本
#直接检查语法错误,但提示出错行数不一定准确3、逻辑错误:
不影响运行,(只能使用 bash -n进行)
加一些脚本的安全选项(可以不加,有些小错误不影响):
1、在脚本的前面输入 set -e 一旦出错就会立即停止
[root@localhost test1]#vim test.sh
set -e
#如果脚本中变量出错,立即停止执行2、在脚本的前面输入set -u 变量不存在不让执行
标准输入输出
标准输出
你发了一条指令给电脑操作,电脑会回复结果给你,结果是一定显示在屏幕上
错误输出
电脑没有正确回复,就是错误
标准输入
我们通过键盘、鼠标、扫描仪、话筒等设备,输入给电脑的指令
重定向
改变输出方向,默认电脑数据的输出方向是屏幕
输出到别的 终端设备
输出到文件中
">"和"<"表示输出的方向,>:表示覆盖;>>:表示追加
命令后加&/dev/null:表示将文件移动到垃圾箱
管道符操作
|将左侧的命令输出结果,作为右侧命令的处理对象
[root@localhost test1]#ps aux |grep bash
#查找所有的进程,并过滤出名称中有bash的进程
变量
变量:可变化的值
常量:不可变化的值
注意:在shell中不区分数据类型,所有的数据都是字符串
设置变量:变量名=变量值(两边都不可有空格)
[root@localhost test1]#vim test.sh
dir=/data
#设置变量调用变量:echo $变量名
[root@localhost test1]#echo $dir
#调用变量删除变量:unset 变量名
[root@localhost test1]#unset dir
#删除变量重定义变量:变量名=变量值
[root@localhost test1]#vim test.sh
dir=/opt
#重定义变量追加变量值:变量名+=变量值
[root@localhost test1]#vim test.sh
dir=/data
dir+=/opt
#追加变量
常见shell变量类型
1、自定义变量
export:加在命令前表示当前环境下所有程序都执行
expr 变量 运算符 变量:计算
echo $[RANDOM%3]:表示任意数取余三,$[]:等同于expr,表示计算
echo 变量 运算符 变量 | bc:也表示计算,但只有这个可以运算小数
2、预定义变量:
$?、$$、$*、$@等shell中自带
显示当前bash的uid号:echo $$
[root@localhost testl]#vim content.sh
#!/bin/bashecho $1
#显示第一个字符
echo $2
#显示第二个字符
echo $3
#显示第三个字符
echo $0
#显示当前脚本名称
echo $#
#显示参数的总数
echo $*
#将参数内容作为一个字符显示
echo $@
#将参数内容分为单个字符,独立显示3、环境变量:
env可以看到所有环境的变量
4、只读变量:
只能读,不能改
5、位置变量:
$1、$2、$3········$n
系统内置变量:
PATH、UID、HOSTNAME、USER
Shell脚本编辑实验
(如果以 .sh 结尾,shell 脚本会高亮显示)
1、查看系统信息脚本
1、touch system.sh
2、vim system.sh
#!/bin/bash
ip=`ifconfig ens33 |grep netmask |tr -s " " |cut -d " " -f3`
#tr -s " "表示压缩空格
cpu=`lscpu |grep 型号名称 |tr -s " " |cut -d " " -f2-6`
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 "----------------------------------------------"
3、bash system.sh
4、sz system.sh
#导出脚本,方便后期使用
2、本地yum安装脚本
1、touch localyum.sh
2、vim localyum.sh
#!/bin/bash
mount /dev/sro /mnt
cd /etc/yum.repos .d
mkdir bak
mv *.repo bakecho "
[local]
name=local
baseurl=file:///mnt
gpgcheck=0
" > local.repoyum clean all &>/dev/null
yum makecache &>/dev/nullyum install tree -y &>/dev/null
3、bash localyum.sh
4、sz localyum.sh
#导出脚本,方便后期使用
3、创建磁盘分区脚本
1、touch disk.sh
2、vim disk.sh
#!/bin/bash
read -p "请输入分区的设备:" disk
read -p "请输入磁盘的大小:" numecho -e "n\n\n\n\n${num}\nw\n" |fdisk ${disk}
3、bash disk.sh
请输入分区的设备:/dev/sdb
请输入磁盘的大小:+10G
4、lsblk
5、sz disk.sh
#导出脚本,方便后期使用