目录
一、Shell脚本概述
1.1.Shell脚本的概念
- 将要执行的命令按顺序保存到一个文本文件
- 给该文件可执行权限
- 可结合各种Shell控制语句以完成更复杂的操作
1.2.Shell脚本应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
- …
1.3.Shell的作用——命令解释器,“翻译官”
- 介于系统内核与用户之间,负责解释命令行
1.4.用户的登录Shell
登录后默认使用的Shell程序,一般为 /bin/bash
不同Shell的内部指令、运行环境等会有所区别
[root@localhost data]# cd
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
二、Shell脚本基础
2.1.Shell的作用
- linux系统中的Shell是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
- 常见的Shell解释器程序有很多种,使用不同的Shell时,其内部指令、命令行提示符等方面会存在一些区别。
- 通过 /etc/shells 文件可以了解当前系统所支持的Shell脚本种类。
查看本机的shell信息
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
2.2.什么是shell脚本?及构成
- 就是使用按顺序将命令——列出,最后自动执行
- 执行需要权限,也可以调用
- 脚本其实不复杂,通用脚本环境改变后依旧可以使用的脚本构成
可执行语句:比如echo命令用于输出“ ”之间的字符串
[root@localhost ~]# vim frist.sh
[root@localhost ~]# cat frist.sh
echo "hello world"
[root@localhost ~]# ./frist.sh
-bash: ./frist.sh: 权限不够
[root@localhost ~]# chmod +x ./frist.sh
[root@localhost ~]# ./frist.sh
hello world
2.3.脚本执行逻辑及执行方式
- 脚本执行逻辑:
1.顺序执行:程序按从上到下顺序执行
2.选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
3.循环执行:程序执行过程中需要重复执行多次某段语句
执行方式:
1.指定路径去执行文件(需要有执行权限)
1.[root@localhost ~]# chmod +x /root/host.sh
2.指定相对路径 ./host.sh
3.指定绝对路径 /root/host.sh
2.指定解释去去执行(不需要权限)
1. [root@localhost ~]# bash host.sh 192.168.157.1
三、使用Shell脚本搭建yum本地仓库
3. 1.在yum仓库里进行操作
[root@localhost ~]# vim yum.sh
cd /etc/yum.repos.d
mkdir aa
mv *.repo aa
echo "[qwe]
name=qwe
baseurl=file:///mnt
gpgcheck=0
enabled=1" >bb.repo
mount /dev/sr0 /mnt
yum clean all
yum install tree -y
[root@localhost ~]# ./yum.sh
3.2.实施效果
[root@localhost ~]# vim yum.sh
[root@localhost ~]# cat yum.sh
cd /etc/yum.repos.d
mkdir aa
mv *.repo aa
echo "[qwe]
name=qwe
baseurl=file:///mnt
gpgcheck=0
enabled=1" >bb.repo
mount /dev/sr0 /mnt
yum clean all
yum install tree -y
[root@localhost ~]# ./yum.sh
-bash: ./yum.sh: 权限不够
[root@localhost ~]# chmod +x ./yum.sh
[root@localhost ~]# ./yum.sh
mount: /dev/sr0 写保护,将以只读方式挂载
已加载插件:fastestmirror, langpacks
正在清理软件源: qwe
Cleaning up everything
Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
Cleaning up list of fastest mirrors
已加载插件:fastestmirror, langpacks
qwe | 3.6 kB 00:00
(1/2): qwe/group_gz | 156 kB 00:00
(2/2): qwe/primary_db | 3.1 MB 00:00
Determining fastest mirrors
正在解决依赖关系
--> 正在检查事务
---> 软件包 tree.x86_64.0.1.6.0-10.el7 将被 安装
--> 解决依赖关系完成
依赖关系解决
=========================================================================
Package 架构 版本 源 大小
=========================================================================
正在安装:
tree x86_64 1.6.0-10.el7 qwe 46 k
事务概要
=========================================================================
安装 1 软件包
总下载量:46 k
安装大小:87 k
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
正在安装 : tree-1.6.0-10.el7.x86_64 1/1
验证中 : tree-1.6.0-10.el7.x86_64 1/1
已安装:
tree.x86_64 0:1.6.0-10.el7
完毕!
3.3.设置ping的限定次数
[root@localhost ~]# ping -c 6 192.168.157.2
PING 192.168.157.2 (192.168.157.2) 56(84) bytes of data.
64 bytes from 192.168.157.2: icmp_seq=1 ttl=128 time=0.229 ms
64 bytes from 192.168.157.2: icmp_seq=2 ttl=128 time=0.290 ms
64 bytes from 192.168.157.2: icmp_seq=3 ttl=128 time=0.199 ms
64 bytes from 192.168.157.2: icmp_seq=4 ttl=128 time=0.624 ms
64 bytes from 192.168.157.2: icmp_seq=5 ttl=128 time=0.295 ms
64 bytes from 192.168.157.2: icmp_seq=6 ttl=128 time=0.176 ms
--- 192.168.157.2 ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5001ms
rtt min/avg/max/mdev = 0.176/0.302/0.624/0.150 ms
四、重定向与管道操作
4.1交互式硬件设备
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息
4.2从一个文件传输到另一个文件,并计算结果。
[root@localhost ~]# echo 1 >cat.txt
[root@localhost ~]# echo 1 >>cat.txt
[root@localhost ~]# seq -s+ 100
1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18
+19+20+21+22+23+24+25+26+27+28+29+30+31+32
+33+34+35+36+37+38+39+40+41+42+43+44+45+
46+47+48+49+50+51+52+53+54+55+56+57+58+
59+60+61+62+63+64+65+66+67+68+69+70+71+
72+73+74+75+76+77+78+79+80+81+82+83+84
+85+86+87+88+89+90+91+92+93+94
+95+96+97+98+99+100
[root@localhost ~]# seq -s+ 100 > shuzi.txt
[root@localhost ~]# bc < shuzi.txt
5050
4.3转移文件
五、变量
- 保存将来会变化的数据,即使数据变化,直接调用变量即可,各种Shell环境中都使用到了“变量”的概念。
- Shell变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。
- 通过使用变量,Shell程序能够提供更加灵活的功能,适应性更强。
5.1变量基础
常见Shell变量的类型包括:
1.自定义变量:由用户自己定义,修改和使用
2.环境变量:由系统维护,用于设置工作环境
3.只读变量:只可以读取不可以更改
4.位置变量:通过命令行给脚本传输参数
5.预定义变量:Bash中内置的一类变量,不能知己修改
赋值并将赋予的值展示出来
[root@localhost data]# class=15
[root@localhost data]# year=2021.10.20
[root@localhost data]# class=ky15
[root@localhost data]# echo $class:$year
ky15:2021.10.20
[root@localhost data]#
提取IP地址
[root@localhost data]# ifconfig ens33
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.157.101 netmask 255.255.255.0 broadcast 192.168.157.255
inet6 fe80::771:e554:a619:3bf2 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:1b:e2:c6 txqueuelen 1000 (Ethernet)
RX packets 8414 bytes 666940 (651.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5224 bytes 629519 (614.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@localhost data]# ifconfig ens33|awk /netmask/'{print $2}'
192.168.157.101
变量转换
[root@localhost data]# ip1=$(ifconfig ens33|awk /netmask/'{print $2}')
[root@localhost data]# echo $ip1
192.168.157.101
5.2自定义变量
5.2.1赋值时使用引号
-
双引号:允许通过$符号引用其他变量值
-
单引号:禁止引用其他变量值, $视为普通字符
-
反撇号:命令替换,提取命令执行后的输出结果
-
{}可以分隔变量值
5.2.2 从键盘输入内容为变量赋值
[root@localhost data]# read -p "请输入一个数字:" num
请输入一个数字:888
[root@localhost data]# echo $num
888
5.2.3Shel脚本录信息
[root@localhost data]# vim 1.sh
[root@localhost data]# sh 1.sh
请输入你的信息ky15
ky15
[root@localhost data]# cat 1.sh
#!/bin/bash
echo -n "请输入你的信息"
read info
echo $info
赋值先后的区别