<linux就该这么学>第四章 Vim编辑器与Shell命令脚本
1. Linux中一切皆文件 2. 如果要修改一个服务,那么就是修改服务对应的配置文件 3. 想让配置文件生效需要重启服务
Vim编辑器的使用
vim包括三种模式:
命令模式
输入模式
末行模式
# 如果文件不存在则保存时,会自动创建
vim 文件
命令模式中常用的命令:
tip:
在RHEL7.5之后,如果搜索后直接保存,那么打开还是搜索结果,可以通过搜索一个不存在的结果,再保存.
末行模式中常用的命令:
Shell脚本的编写
Shell命令有两种工作方式:
交互式:用户每输入一条就执行一条
批处理:用户编写一个完整的shell脚本,一次性执行
Shell脚本的变量定义与执行
变量定义时不需要些$
,引用变量是需要写$
,shell脚本一般用sh
作为文件的后缀。
>>>
[root@ecs-3511-0001 ~]# vim test.sh
#!/bin/bash #此处定义执行该脚本的解释器路径
#test Shell #此处写该脚本的注释
pwd # 命令
NAME='LG' # 定义变量
echo $NAME # 输出变量
[root@ecs-3511-0001 ~]# bash test.sh
/root
LG
[root@ecs-3511-0001 ~]# ./test.sh
-bash: ./test.sh: Permission denied
[root@ecs-3511-0001 ~]# chmod u+x test.sh
[root@ecs-3511-0001 ~]# ./test.sh
/root
LG
Shell脚本的参数接收
>>>
[root@ecs-3511-0001 ~]# cat test2.sh
#!/bin/bash
#test2
echo "当前脚本的名称: $0"
echo "当前脚本的参数数量:$#"
echo "当前脚本的所有参数:$*"
echo "第一个参数为:$1"
[root@ecs-3511-0001 ~]# ./test2.sh one two three
当前脚本的名称: ./test2.sh
当前脚本的参数数量:3
当前脚本的所有参数:one two three
第一个参数为:one
判断
文件测试
# 如果为真,则其结果为真,输出会显示0
[ 操作符 文件 ]
>>>
[root@ecs-3511-0001 ~]# ls
a.txt c test.sh test2.sh
[root@ecs-3511-0001 ~]# [ -d /root/c ]
[root@ecs-3511-0001 ~]# echo $?
0
[root@ecs-3511-0001 ~]# [ -d /root/c1 ]
[root@ecs-3511-0001 ~]# echo $?
1
逻辑运算
>>>
[root@ecs-3511-0001 ~]# ls
a.txt c test.sh test2.sh
[root@ecs-3511-0001 ~]# [ -d /root/c ] && echo "真"
真
[root@ecs-3511-0001 ~]# [ -d /root/c1 ] && echo "真"
[root@ecs-3511-0001 ~]# [ -d /root/c1 ] || echo "假"
假
[root@ecs-3511-0001 ~]# [ -d /root/c ] && echo "真" || echo "假"
真
[root@ecs-3511-0001 ~]# [ -d /root/c1 ] && echo "真" || echo "假"
假
整数比较运算符
[root@ecs-3511-0001 ~]# [ 10 -eq 10 ]
[root@ecs-3511-0001 ~]# echo $?
0
[root@ecs-3511-0001 ~]# [ 10 -eq 11 ]
[root@ecs-3511-0001 ~]# echo $?
1
[root@ecs-3511-0001 ~]# [ 10 -eq a ]
-bash: [: a: integer expression expected
字符串比较
[root@ecs-3511-0001 ~]# [ a = a ]
[root@ecs-3511-0001 ~]# echo $?
0
[root@ecs-3511-0001 ~]# [ a = b ]
[root@ecs-3511-0001 ~]# echo $?
1
[root@ecs-3511-0001 ~]# TEST=''
[root@ecs-3511-0001 ~]# [ -z TEST ]
[root@ecs-3511-0001 ~]# echo $?
1
流程控制
if条件判断
if 条件1
then 条件1成立时的命令
elif 条件2
then 条件2成立时的命令
else 条件1、2都不成立的命令
fi
[root@ecs-3511-0001 ~]# cat test4.sh
#!/bin/bash
# 这个是用来判断分数的
NUM=$1
if [ $NUM -lt 60 ]
then echo "您没有及格"
elif [ $NUM -le 80 ]
then echo "您的成绩良好"
elif [ $NUM -le 100 ]
then echo "您的成绩优秀"
else echo "分数不合法"
fi
[root@ecs-3511-0001 ~]# bash test4.sh 50
您没有及格
[root@ecs-3511-0001 ~]# bash test4.sh 80
您的成绩良好
[root@ecs-3511-0001 ~]# bash test4.sh 100
您的成绩优秀
[root@ecs-3511-0001 ~]# bash test4.sh 101
分数不合法
for 条件循环
for 变量 in 数据
do
执行的命令
done
>>>
[root@ecs-3511-0001 ~]# cat userlist.txt
root
user1
user2
user3
user4
[root@ecs-3511-0001 ~]# cat test5.sh
#!/bin/bash
# 该脚本会读取用户列表创建用户并由用户指定密码
for UNAME in `cat userlist.txt`
do
# 将输出内容定向到黑洞
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "用户$UNAME已经存在"
else
read -p "请指定用户$UNAME的密码:" UPASSWD
useradd $UNAME &> /dev/null && echo "$UPASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then echo "用户$UNAME创建成功"
else echo "用户$UNAME创建失败"
fi
fi
done
[root@ecs-3511-0001 ~]# bash test5.sh
用户root已经存在
请指定用户user1的密码:123
用户user1创建成功
请指定用户user2的密码:123
用户user2创建成功
请指定用户user3的密码:123
用户user3创建成功
请指定用户user4的密码:123
用户user4创建成功
[root@ecs-3511-0001 ~]# bash test5.sh
用户root已经存在
用户user1已经存在
用户user2已经存在
用户user3已经存在
用户user4已经存在
tip:
/dev/null 类似于win的回收站,但没有回收功能
$(cat 文件) 与
cat 文件
效果一样
while循环
# do...done 中如果使用了exit可以让程序跳出循环
while true/false
do
命令或exit 0
done
>>>
[root@ecs-3511-0001 ~]# cat test8.sh
#!/bin/bash
#测试while
while true
do
read -p "请输入数字,0代表结束:" UINPUT
if [ ! $UINPUT -eq 0 ]
then echo "您输入了$UINPUT"
else
echo "结束"
exit 0
fi
done
[root@ecs-3511-0001 ~]# bash test8.sh
请输入数字,0代表结束:1
您输入了1
请输入数字,0代表结束:0
结束
[root@ecs-3511-0001 ~]# cat test9.sh
#!/bin/bash
#测试while
TAG=true
while $TAG
do
read -p "请输入数字,0代表结束:" UINPUT
if [ ! $UINPUT -eq 0 ]
then echo "您输入了$UINPUT"
else
echo "结束"
TAG=false
fi
done
[root@ecs-3511-0001 ~]# bash test9.sh
请输入数字,0代表结束:0
结束
case条件处理
case 变量 in
范围1)
命令1
;;
范围2)
命令2
;;
*)
不属于范围1和范围2时的命令
;;
esac
>>>
[root@ecs-3511-0001 ~]# cat test10.sh
#!/bin/bash
# 测试case
read -p "请输入单个字符:" UINPUT
case $UINPUT in
[0-9])
echo "您输入的是数字"
;;
[a-z]|[A-Z])
echo "您输入的是字母"
;;
*)
echo "没有判断出来您的输入类型"
esac
[root@ecs-3511-0001 ~]# bash test10.sh
请输入单个字符:1
您输入的是数字
[root@ecs-3511-0001 ~]# bash test10.sh
请输入单个字符:a
您输入的是字母
[root@ecs-3511-0001 ~]# bash test10.sh
请输入单个字符:~
没有判断出来您的输入类型
计划任务
定时任务
# 启动任务
## 方式一:
at 时间 >>> 命令 ctrl+d 结束输入
## 方式二:
echo ”命令“ | at 时间
# 查看任务列表
at -l
# 查看任务具体的内容
## 结果的最后一行为执行的命令
at -c 任务编号
# 删除任务
atrm 任务编号
[root@ecs-3511-0001 ~]# ll a.txt
-rw-r--r-- 1 root root 4 Jan 20 17:09 a.txt
[root@ecs-3511-0001 ~]# uptime
17:10:58 up 7:39, 4 users, load average: 0.03, 0.07, 0.07
[root@ecs-3511-0001 ~]# ll a.txt
-rw-r--r-- 1 root root 4 Jan 20 17:11 a.txt
[root@ecs-3511-0001 ~]# at -l
2 Thu Jan 21 12:08:00 2021 a root
[root@ecs-3511-0001 ~]# atrm 2
[root@ecs-3511-0001 ~]# at -l
周期任务
周期的任务由crontab执行,任务中的命令需要写全路径(因为crontab读取不到变量),可以使用 whereis
命令来查看命令的完整路径
# 查看或编辑周期任务
crontab -e
# 定时任务的写法,如果不需要改参数,那么需要用*代替
分 小时 天 月 星期 命令
# 编辑其它用户的周期任务
crontab -u 用户名
>>>
[root@localhost ~]# ll a.txt
-rw-r--r--. 1 root root 4 Jan 18 01:21 a.txt
[root@localhost ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
## 文件内容如下,没分钟更新下文件的时间
*/1 * * * * /usr/bin/touch /root/a.txt
[root@localhost ~]# systemctl status crond
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor prese>
Active: active (running) since Mon 2021-01-18 00:52:14 CST; 2 days ago
Main PID: 1419 (crond)
Tasks: 1 (limit: 12390)
Memory: 2.6M
CGroup: /system.slice/crond.service
└─1419 /usr/sbin/crond -n
[root@localhost ~]# ll a.txt
-rw-r--r--. 1 root root 4 Jan 20 23:18 a.txt
需要启动周期任务服务,周期任务才能生效
# 查看周期任务的状态
systemctl status crond
# 重启服务
systemctl restart crond
# 加入自启动服务
systemctl enable crond
License:
CC BY 4.0