linux系统中一切皆文件,因此经常需要编辑文件内容。人们linux系统中都会安装Vim文本编辑工具。 vim是vi的升级版
vim有三种模式:
命令模式:控制光标移动,可对文本进行删除、赋值、粘贴等操作
输入模式:可以正常输入文本
末行模式:保存、退出与设置编辑环境
每次运行vim后默认进入命令模式,三种模式的切换方式如下:
命令模式常用快捷键:
dd 删除(剪切)光标所在的行
5dd 删除(剪切)光标所在的行开始的5行
yy 复制光标所在的整行
5yy 赋值光标所在行开始的5行
p 将剪切赋值的行粘贴到光标后
/字符串 在文本中从上至下搜索该字符串
?字符串 在文本中自下而上搜索该字符串
n 显示搜索命令定位到下一个字符串
N 显示搜索命令定位到上一个字符串
u 撤销上一步操作
末行模式常用命令:
:w 保存
:q 退出
:q! 强置退出(放弃修改)
:wq! 强制保存退出
:set nu 显示行号
:set nonu 不显示行号
:整数 跳转到该行
在命令模式和末行模式中所有的命令都区分大小写
[root@localhost ~]# vi /etc/hostname
server1
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=192.168.12.10
NETMASK=255.255.255.0
GATEWAY=192.168.12.1
DNS=192.168.12.1
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=032e7ad3-cb98-49f1-ab3a-328e437aba77
DEVICE=ens33
ONBOOT=yes
[root@localhost ~]# systemctl restart network
Shell是用户与Linux系统通讯的媒介,自身也定义了各种变量参数,提供了循环、分支等高级语言才有的控制结构特性。如何使用这些功能,准确下达指令尤为重要。
Shell的工作形式分为两种
交互式:用户输入一条命令,Shell解释并执行一条
批处理:事先编写一个Shell脚本,其中包含很多命令,Shell一次执行完所有命令。
查看系统中可用的Shell解释器
[root@localhost yum.repos.d]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
查看当前的Shell解释器
[root@localhost yum.repos.d]# echo $SHELL
/bin/bash
一个完整的脚本应该包括:
**脚本声明(#!):**告知系统用何种shell来解释
**注释信息(#):**对执行语句或程序做介绍 不必须
**可执行语句:**具体的命令
编写一个简单的test.sh
[root@localhost test]# vi test.sh
#!/bin/bash
#example
pwd
ls -al
~
执行脚本的三种方法:
脚本文件路径:./test.sh
sh脚本文件路径:sh test.sh
source脚本文件路径:source test.sh
执行示例:
[root@localhost test]# ./test.sh
-bash: ./test.sh: 权限不够
[root@localhost test]# ll
总用量 4
-rw-r--r--. 1 root root 32 10月 21 04:58 test.sh
[root@localhost test]# chmod u+x test.sh
[root@localhost test]# ./test.sh
/root/test
总用量 4
drwxr-xr-x. 2 root root 21 10月 21 04:58 .
dr-xr-x---. 6 root root 234 10月 21 04:56 ..
-rwxr--r--. 1 root root 32 10月 21 04:58 test.sh
[root@localhost test]# sh test.sh
/root/test
总用量 4
drwxr-xr-x. 2 root root 21 10月 21 04:58 .
dr-xr-x---. 6 root root 234 10月 21 04:56 ..
-rwxr--r--. 1 root root 32 10月 21 04:58 test.sh
[root@localhost test]# source test.sh
/root/test
总用量 4
drwxr-xr-x. 2 root root 21 10月 21 04:58 .
dr-xr-x---. 6 root root 234 10月 21 04:56 ..
-rwxr--r--. 1 root root 32 10月 21 04:58 test.sh
[root@localhost test]#
shell脚本执行时可以传入参数,如: test.sh p1 p2
脚本中可以通过 1 − 9 , 1-9, 1−9,{10}, 11 , . . . {11},... 11,...{n} 访问对应位置的参数
除此之外shell脚本中还内置了如下参数:
$0 当前执行Shell脚本的程序名
$# 一共有多少个参数
$* 所有位置变量的值
$? 判断上一条命令是否执行成功 0 为成功 非0 表示失败
编写如下脚本并执行:
[root@localhost test]# vi test2.sh
#!/bin/bash
echo "当前脚本名称:$0"
echo "总共$#个参数"
echo "第一个参数$1"
echo "所有位置变量的值 $*"
echo "上一条是否执行结果$?"
[root@localhost test]# chmod u+x test2.sh
[root@localhost test]# ./test2.sh p1 p2 p3 p4
当前脚本名称:./test2.sh
总共4个参数
第一个参数p1
所有位置变量的值 p1 p2 p3 p4
上一条是否执行结果0
Shell脚本有时候需要判断用户输入参数,如mkdir命令要判断目录是否存在。
可以通过条件测试语句来完成判断,格式:【 条件表达式 】 两边均有空格
条件测试语句包含:文件测试、逻辑测试、整数值比较、字符串比较
格式:【 操作符 文件或目录名 】
-d 测试是否是目录
-e 测试文件或目录是否存在
-f 是否为文件
-r 测试当前用户是否有权读入
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行
示例如下:
[root@bogon ~]# [ -d /etc/f ]
[root@bogon ~]# echo $?
1
[root@bogon ~]# [ -d /etc ]
[root@bogon ~]# echo $?
0
[root@bogon ~]#
格式:[ 表达式1 ] 操作符 [ 表达式2 ]
&& 逻辑与
|| 逻辑或
! 逻辑非
如果当前用户是root 则输出 root
[root@bogon ~]# [ $USER==root ] && echo "root"
root
格式:[ 整数1 操作符 整数2 ]
-eq 是否等于
-ne 是否不定于
-gt 是否大于
-lt 是否小于
-le 小于等于
-ge 大于等于
示例:
[root@bogon ~]# [ 10 -gt 10 ]
[root@bogon ~]# echo $?
1
格式:[ 字符串1 操作符 字符串2 ]
= 字符串内容是否相同
!= 字符串内容是否不同
-z 字符串是否为空
判断字符串是否为空:
[root@bogon ~]# [ -z '' ]
[root@bogon ~]# echo $?
0
[root@bogon ~]# [ -z '1' ]
[root@bogon ~]# echo $?
1
条件测试语句能够让Shell脚本根据实际情况灵活调整工作内容。
单分支if
编辑脚本 并执行
判断testdir是否 目录是否存在如果不存在则创建
[root@localhost tmpdir]# vi test.sh
#!/bin/bash
DIR=testdir
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi
[root@localhost tmpdir]# ./test.sh
双分支if
编写脚本test2.sh 并测试
执行 ping 命令 如果 执行成功输出 地址 可用 ,否则输出地址不可用
[root@localhost tmpdir]# vi test2.sh
#!/bin/bash
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]
then
echo "HOST $1 is up"
else
echo "Host $1 is down"
fi
[root@localhost tmpdir]# ./test2.sh ww.baddi.com
Host ww.baddi.com is down
多分支if
用户输入成绩,根据成绩输出 Excellent Good Fail,如下:
[root@localhost tmpdir]# vi test3.sh
#!/bin/bash
read -p "enter your score (0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "Excellent"
elif [ $GRADE -ge 60 ] && [ $GRADE -le 85 ] ; then
echo "Good"
else
echo "Fail"
fi
[root@localhost tmpdir]# ./test3.sh
enter your score (0-100):90
Excellent
[root@localhost tmpdir]# ./test3.sh
enter your score (0-100):70
Good
语法:
for 变量名 in 取值列表
do
命令序列
done
示例:
从文件中读取用户,如果用户不存在则创建并设置成输入的密码。
创建文本文件user.txt,内容如下
[root@bogon tmpdir]# vi user.txt
zhangsan
lisi
wangwu
编写脚本如下
[root@bogon tmpdir]# vi testfor.sh
#!/bin/bash
read -p "Enter The Users Password:" PASSWD
for UNAME in `cat user.txt`
do
id $UNAME &>/dev/null
if [ $? -eq 0 ]
then
echo "user $UNAME already exists"
else
useradd $UNAME &>/dev/null
echo "$PASSWD" | passwd --stdin $UNAME &>/dev/null
if [ $? -eq 0 ]
then
echo "create SUCCESS"
else
echo "create failed"
fi
fi
done
~
执行结果
[root@bogon tmpdir]# ./tetfor.sh
Enter The Users Password:123456789
create SUCCESS
create SUCCESS
create SUCCESS
[root@bogon tmpdir]# ./tetfor.sh
Enter The Users Password:zxm123
user zhangsan already exists
user lisi already exists
user wangwu already exists
[root@bogon tmpdir]#
语法
while 条件测试操作
do
命令序列
done
示例
随机生成0~999范围内的一个整数,然后提示用户输入数字进行猜测,程序根据猜测结果提示 高了还是低了,猜中后程序退出
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "数字在0-999之间,猜猜看是多少"
while true
do
read -p "请输入:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "猜对了,您共猜了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "高了!你再猜:"
else
echo "低了! 你再猜:"
fi
done
根据变量不同的取值,执行不同的命令操作
语法
case 变量值 in
模式1)
命令序列
;;
模式2)
命令序列
;;
......
*)
默认命令序列
esac
示例
韩式字母输入一个字符判断是数字还是字母,如下:
[root@bogon tmpdir]# vi testcase.sh
#!/bin/bash
read -p "请输入yes或no 按Enter键确认:" KEY
case $KEY in
[a-z]|[A-Z])
echo "您输入的是字母"
;;
[0-9])
echo "您输入的是数字"
;;
*)
echo “您输入的内容$KEY既不是字母也不是数字”
;;
esac
计划任务让linux操作同按照时间规则自动执行程序。计划任务分为一次性计划任务和长期性计划任务。
通过 atd服务来实现,通过命令 at 来进行操作
at <时间> 安排一次性任务
atq 或 at -l 查看任务列表
at -c 序号 预览任务与设置环境
atrm 序号 删除任务
示例
如果没有安装该命令 则 执行 yun install at 安装
进入at 命令后 ctrl +d 保存并退出。
[root@bogon ~]# at 15:30
at> echo `date`
at>
job 1 at Tue Oct 20 15:30:00 2020
Can't open /var/run/atd.pid to signal atd. No atd running?
[root@bogon ~]# atq
1 Tue Oct 20 15:30:00 2020 a root
通过crontab服务实现
命令
创建、编辑计划任务 crontab -e [ -u 用户名]
查看计划任务 crontab -l [ -u 用户名]
删除计划任务 crontab -r [ -u 用户名]
定时任务格式:
分(0-59) 时(0-23) 日(1-31) 月(1-12) 星期(0-7 07都是星期日) 命令(脚本或命令)
示例:
每分钟执行一次/root/tmpdir/task.sh脚本
定义任务
定义任务时将小时 修改为16 定时任务一直不执行 修改为 4 才能正常执行 原来是时间不对
[root@bogon ~]# crontab -e
5 4 * * 1 /root/tmpdir/task.sh
~
task.sh脚本内容
写入当前时间到date.txt文件
#!/bin/bash
echo `date` >> /root/date.txt
[root@bogon ~]#
date.txt输出结果
[root@bogon ~]# tail -f date.txt
Mon Oct 26 04:09:01 EDT 2020
Mon Oct 26 04:10:01 EDT 2020
如果定时任务不执行
1、查看crond服务状态是否正常 service crond status
[root@VM-0-9-centos mail]# service crond status
Redirecting to /bin/systemctl status crond.service
● crond.service - Command Scheduler
Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2020-11-23 21:35:06 CST; 24h ago
Main PID: 975 (crond)
CGroup: /system.slice/crond.service
└─975 /usr/sbin/crond -n
2、查看日志
如下目录 root文件中的内容会显示执行遇到的异常
[root@VM-0-9-centos mail]# pwd
/var/spool/mail
[root@VM-0-9-centos mail]# ll
total 16
-rw------- 1 root mail 13811 Nov 24 21:53 root
-rw-rw----. 1 rpc mail 0 Aug 8 2018 rpc