第四章 vim与shell脚本基础
1. vim文本编辑器
三个模式:编辑模式、尾行模式、命令模式
切换方式:ESC
、:
、i
(insert)、a
(从光标后一个位置开始)、o
(从下一行开始)
表 1 Vim 中常用的命令
命令 | 作用 |
---|---|
dd | 删除(剪切)光标所在整行 |
5dd | 删除(剪切)从光标处开始的 5 行 |
yy | 复制光标所在整行 |
5yy | 复制从光标处开始的 5 行 |
n | 显示搜索命令定位到的下一个字符串 |
N | 显示搜索命令定位到的上一个字符串 |
u | 撤销上一步的操作 |
p | 将之前删除( dd)或复制( yy)过的数据粘贴到光标后面 |
注意:
:wq
强制性写入文件并退出。即使文件没有被修改也强制写入,并更新文件的修改时间。:x
写入文件并退出。仅当文件被修改时才写入,并更新文件修改时间,否则不会更新文件修改时间,这可以避免对未修改的文件因时间戳?变化而重新编译。
表 2 末行模式中可用的命令
命令 | 作用 |
---|---|
:w | 保存 |
:q | 退出 |
:q! | 强制退出(放弃对文档的修改内容) |
:wq! | 强制保存退出 |
:set nu | 显示行号 |
:set nonu | 不显示行号 |
:命令 | 执行该命令 |
:整数 | 跳转到该行 |
:s/one/two | 将当前光标所在行的第一个 one 替换成 two |
:s/one/two/g | 将当前光标所在行的所有 one 替换成 two |
:%s/one/two/g | 将全文中的所有 one 替换成 two |
?字符串 | 在文本中从下至上搜索该字符串 |
/字符串 | 在文本中从上至下搜索该字符串 |
2. 编辑配置文件举例
修改主机名hostname
- 传统方法
vim /etc/hostname
- 传统方法
CentOS8
hostnamectl set-hostname TestNode --static
配置网卡信息
vim /etc/sysconfig/network-scripts
关键配置:
1
2
3
4
5BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.1.100
NETMASK=255.255.255.0
GATEWAY=192.168.1.1重启网卡
systemctl restart network
配置yum源(后面单独出个blog)
cd /etc/yum.repo.d/
,在这里添加仓库配置文件*.repo。一般有两种,本地盘或者在线源:- 挂载镜像iso,配置本地源
- 配置网络源,如清华云、华为云、阿里云
配置完成后,就可以直接通过yum install安装软件
3. shell脚本编写
3.1 内置的参数变量
特殊变量 | 含义 |
---|---|
$0 | 当前脚本名 |
$1 | 第一个参数,依次类推$2,$3,…第2个,第3个 |
$# | 传递给脚本或函数的参数的个数 |
$* | 传递给脚本或函数的所有参数 |
$@ | 传递给脚本或函数的所有参数,同上 |
$? | 上个命令的退出状态或执行的返回值 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID |
$*和$@的区别:
当参数是用" "
括起来的时候,$*会将所有的参数最为一个字符串整体;$@会将各个参数分开,每个参数是一个子字符串。
3.2 参数判断
格式[ 条件判断 ]
注意:括号两边各空1格,条件成立返回数字0!
按照判断类型来划分,条件判断语句可以分为4类:
- 文件判断:是否存在、文件类型、读写权限等
- 逻辑判断:判断是否成立
- 数值判断:整数大小比较
- 字符比较:字符串内容是否相同,或者是否为空
文件测试判断
运算符 描述 -e 文件是否存在 -d / -f 是否为目录;是否为一般文件 -r / -w / -x 是否有读、写、执行权限 与、或、非
1
2
3
4举例
[ -d /etc/fstab ]
echo $?
1 # 不是目录,而是文件,条件不成立,返回1常利用与、或语句的短路作用:
1
2
3
4
5
6
7[root@local ~]# [ $USER = root ] || echo "Not root" && echo "root"
root
[root@local ~]# [ ! $USER = root ] && echo "Not root" || echo "root"
root
实际应用举例
[ -e result.log ] && echo "File Exist" || echo "File not found"整数比较
注意,以下运算符只能用于整数判断,不能与字符串、文件等混在一起操作
运算符 作用 -eq / -ne 等于 / 不等于 -gt / -lt 大于 / 小于 -ge / -le 小于或等于 / 大于或等于 字符串判断
运算符 作用 = 字符串是否相同 [ $(uname -m) = “aarch64” ] && echo “ARM arch” != 字符串是否不同 [ $(uname -m) != “aarch64” ] && echo “x86 arch” -z 判断字符串是否为空,常用与判断是否有参数输入
3.3 流程控制语句
常见的流程结构,包含2大类,即分支结构和循环结构
- if 分支:关键字
if
、then
、elif
、else
、fi
- case 分支:关键字
case
、in
、esac
- for 循环:关键字
for
、in
、do
、done
- while 循环:关键字
while
、do
、done
1. if分支
1 | if [ $(uname -m) = 'x86_64' ] ; then |
2. case分支
1 |
|
3. for循环
1 | for LINE in $(cat result.log) ; do |
4. while循环
1 |
|
4. 实例
4.1 测试各个主机是否连通
- IP列表:
cat ip.txt
1 | 192.168.1.1 |
- 检测列表IP
1 |
|
4.2 数组遍历
- 只有一维数组
- 下标从0开始
- 元素用空格分隔开
1 |
|
部分结果打印:
1 | a |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Cloud-Weblog!