BASH 与 shell 的 概念 与 关系
- Shell (贝壳):命令行
- BASH :Shell 命令行的的一种类型 (各大 Linux 发行版本的默认 Shell)
Shell 命令行的功能:(人 与 计算机硬件 沟通的桥梁 —— ①人找命令行 ②命令行通知内核 ③内核驱动硬件工作)
- 执行命令
- 程序编程
用几行行命令 做出一个简单的 shell 脚本
- touch myfirt_shell.sh # 创建脚本 myfirt_shell.sh 文件
- vim myfirt_shell.sh # 编辑 脚本文件
- cat myfirt_shell.sh
#!/bin/bash # #!/bin/bash 脚本 开头格式 !!
echo "this is my first shell script"
hostname
whoami
id
echo "OK!"
- chmod +x myfirt_shell.sh # 给脚本文件添加 执行权限 x
- ls -l myfirt_shell.sh
- sh myfirt_shell.sh # 运行脚本 sh + 脚本文件名
this is my first shell script
client.westos.com
root
uid=0(root) gid=0(root) groups=0(root) # 简单的 shell 就是依次顺序 从上到下执行,直到结束
OK!
管道命令 (pipe)—— BASH 命令执行的输出数据,需要管道命令处理后才能得到想要的格式
- 管道命令仅会处理标准输出 ,对于标准错误会予以忽略
- 管道命令必须要能够接受来自前一个命令数据成为标准输入继续处理才行
注意:让标准错误可以被管道命令使用,用数据重定向 , 让 2>&1 加入命令,即可让 2> 变成 1>
信息选取命令:cut、grep
cut 命令
- -d '分隔字符' -f fields : 根据 -d 的分隔字符将一段信息划分成数段,用 -f 取出第几段
- -c 字符区间 :以字符 (characters)的单位取出固定字符区间;
grep 命令
- -a:将二进制文件以文本文件的方式查找数据
- -c:计算找到 ' 查找字符 ' 的次数
- -i:忽略大小写的不同
- -n:输出行号
- -v:反向选择,即显示出没有 ' 查找字符 ' 的那一行
- --color=auto:将找到的关键字符部分加上颜色
例:将 last 当中,出现 ' root ' 的行选取出,显示
- last | grep 'root'
例:将 last 当中,只要没有 ' root ' 的行就选取出,显示
- last | grep -v 'root'
例 将 last 当中,只要出现 ' root ' 的行就选取出,并且仅取第一栏
- last | grep 'root' | cut -d ' ' -f 1
信息排序命令:sort 、wc 、uniq
sort [ -fbMnrtuk ] [ file or stdin ] 命令 以文字 或 数字 来排序
- -f:忽略大小写差异
- -b:忽略最前面的空格字符部分
- -n:使用 【纯数字】进项排序 (默认以文字形式来排序)
- -r:反向排序
- -u:即 uniq ,相同输出数据,仅出现一行代表
- -t:分隔符号,默认使用 [Tab] 键来分隔
- -k:以哪个区间 (field)来进行排序
- -M:以月份的名字来排序
例:将账号记录 /etc/passwd 进行排序
例:将 password 的内容,以 : 分隔,并以第三栏来排序
例:将 last 输出数据,仅显示账号 ,并加以排序
uniq [ -ic ] 命令 (将重复的行删掉,只显示一个)
- -i:忽略大小写字符的不同
- -c:进行计数
例:使用 last 将账号列出,仅取出账号栏,进行排序后仅取出一位,并计算重复数量
- last | cut -d ' ' -f1 | sort | uniq -c
wc [ -l wn ] 命令 计算输出信息的整体数据(文件内含多少字?多少行?多少字符?等)
- -l: 仅列出行
- -w:仅列出多少字(英文字母)
- -m:多少字符
例:/etc/passwd 里面有多少相关字、行、字符数?
- cat /etc/passwd | wc
52 115 2866
例:使用 last 可以输出登录者,但last最后两行并非账号内容,如何以命令串取得登录系统的总人次?
- last | grep [a-zA-Z] | grep -v 'wtmp'|grep -v 'unkown' | \
> grep -v 'reboot'| wc -l
14
test 命令
test = [ ] # [ ] 相当于 test 命令
例: " test $a =$b " = [ "$a" = "$b" ]
test 数字对比
= / !=
- -eq: 等于
- -ne:不等于
- -le:小于等于
- -lt:小于
- -ge:大于等于
- -gt:大于
test 的条件关系
- -a:并且
- -o:或者
test 对空的判定
- -n: nozero 判定内容不为空
- -z: zero 判定内容为空
test 对文件的判定
- -ef:文件节点号是否一致
- -nt:文件1 是不是比文件 2 新
- -ot:文件1 是不是比文件 2 旧
- -d:目录
- -S:套字节
- -L:软连接
- -e:存在
- -f:普通文件
- -b:快设备
- -c:字符设备
例 :编写脚本完成以下条件
file_check.sh 在执行时,①如果脚本未指定检测文件报错 “未指定检测文件,请指定” ,②如果脚本执行后指定文件不存在 ,报错“此文件不存在”,且当文件存在时请检测文件类型,并显示到输出中。
命令执行的判断依据 : ;、&&、||
- cmd ; cmd (不考虑命令相关性的连续命令执行)
- $? (命令返回值) 与 && 或 || (两个命令有依赖性,依赖性主要判断的地方在于前一个命令执行的结果是否正确)
cmd 1 && cmd 2
- 若 cmd 1 执行完毕且正确执行($?=0),则开始执行 cmd 2
- 若 cmd 1 执行完毕且为错误($?≠0),则不执行 cmd 2
cmd 1 || cmd 2
- 若 cmd 1 执行完毕且正确执行($?=0),则不执行 cmd 2
- 若 cmd 1 执行完毕且为错误($?≠0),则开始执行 cmd 2
例:使用 ls 查看目录 /root/abc 是否存在,若存在则用 touch 建立 /root/abc/hehe。
- ls /root/abc && touch /root/abc/hehe
ls: cannot access '/root/abc': No such file or directory # ls 为找到目录,报错。touch 未执行
- mkdir /root/abc # 新建 /root/abc 目录
- ls /root/abc && touch /root/abc/hehe
- ll /root/abc
-rw-r--r-- 1 root root 0 Jul 2 17:56 hehe # ls 找到目录 , touch 执行
例:测试 /root/abc 是否存在,如不存在则予以建立,若存在不做任何操作
- rm -fr /root/abc
- ls /root/abc || mkdir /root/abc
ls: cannot access '/root/abc': No such file or directory
- ll -d /root/abc
drwxr-xr-x 2 root root 6 Jul 2 18:06 /root/abc
例:不清楚 /root/abc 是否存在,但就是要建立 /root/abc/hehe 文件
- ls /root/abc || mkdir /root/abc && touch /root/abc/hehe
脚本编程的实践案例
案例:Shell 脚本 + dhcpd 、httpd、kickstart 实现自动安装 虚拟机系统
安装环境需求
- HTTP服务(FTP/NIS),提供yum安装源
- DHCP服务:分配IP地址,定位引导程序
- kickstart自动安装脚本的制作
步骤一 添加硬盘(安装虚拟机的硬件存储)
- 添加设备 —— 硬盘 (SATA)50G
- fdisk -l # 查看设备
- fdisk /dev/sdb # 对添加的硬盘进行磁盘分区
- udevadm settle # 不重启 添加硬盘
- mkfs.xfs -K /dev/sdb1 #格式化设置 磁盘文件系统为 .xfs格式
步骤二 虚拟机安装环境设置
- dnf group list --hidden
- dnf group install "Virtualization Client" "Virtualization Hypervisor" "Virtualization Tools" -y # 安装 虚拟机安装环境插件
- mount /dev/sdb1 /var/lib/libvirt/images/ # 将添加的硬盘设备挂载到虚拟机安装指定目录
- blkid # 查看 sdb1 设备 的 UUID
- vim /etc/fstab # 编辑设置开机启动自动挂载
- mount -a
步骤三 网络软件仓库搭建
- dnf install httpd -y # 安装 共享软件 Apache (阿帕奇 网页服务软件 Apache HTTP Server )
- systemctl enable --now httpd # 开启启动,并立即启用 httpd
- mkdir /var/www/html/rhel8 # 创建 共享目录 rhel8
- mount /run/media/root/RHEL-8-0-0-BaseOS-x86_64 /var/www/html/rhel8/ --bind # 系统镜像 挂载 共享目录 --bind
步骤四 网卡配置
双网卡主机配置 :添加设备——网络配适器2 (桥接模式)
- cd /etc/sysconfig/network-scripts/
- ls
- cp ifcfg-ens160 ifcfg-br0
- vim ifcfg-ens160
- vim ifcfg-br0
- nmcli connection reload
- nmcli connection down ens160
- nmcli connection down br0
- nmcli connection up ens160
- nmcli connection up br0
步骤五 DHCP 服务器搭建
- dnf install dhcp-server -y
- cd /etc/dhcp/
- ls
- cp /usr/share/doc/dhcp-server/dhcpd.conf.example dhcpd.conf # 模板文件生成 dhcpd.conf
- vim dhcpd.conf # 编辑 配置文件 172.25.254.10 为 dhcp 服务器
- systemctl enable --now dhcpd # 启用 dhcpd 服务
步骤六 kickstart自动安装脚本的制作
- cp -a /root/anaconda-ks.cfg /var/www/html/ks.cfg #模板/root/anaconda-ks.cfg ,重命名为ks.cfg 到网络共享目录下
- chmod 755 /var/www/html/ks.cfg # 赋予755文件权限
- vim /var/www/html/ks.cfg # 编辑启动脚本
步骤七 测试手动设置安装虚拟机
- virt-manager
步骤七 编辑Shell 脚本 实现自动设置安装选项
- touch virt.sh
- vim virt.sh
#!/bin/bash
virt-install \
--location http://172.25.254.10/rhel8 \
--extra-args "ks=http://172.25.254.10/ks.cfg" \
--os-variant rhel8.0 \
--memory 2000 \
--vcpus 1 \
--disk path=/var/lib/libvirt/images/westos.qcow2,bus=virtio,size=10 \
--name westos \
--network type=bridge,source=br0,source_mode=virtio &> /dev/null &
- sh virt.sh # 运行脚本 实现自动安装虚拟机系统配置