linux笔记3-vi编辑器、shell脚本、定时任务

VIM文本编辑器

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

配置光盘yum仓库

进入目录/etc/yum.repos.d 参考步骤如下:
在这里插入图片描述

Shell脚本

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 1021 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 1021 04:58 .
dr-xr-x---. 6 root root 234 1021 04:56 ..
-rwxr--r--. 1 root root  32 1021 04:58 test.sh
[root@localhost test]# sh test.sh
/root/test
总用量 4
drwxr-xr-x. 2 root root  21 1021 04:58 .
dr-xr-x---. 6 root root 234 1021 04:56 ..
-rwxr--r--. 1 root root  32 1021 04:58 test.sh
[root@localhost test]# source test.sh
/root/test
总用量 4
drwxr-xr-x. 2 root root  21 1021 04:58 .
dr-xr-x---. 6 root root 234 1021 04:56 ..
-rwxr--r--. 1 root root  32 1021 04:58 test.sh
[root@localhost test]# 

接收用户参数

shell脚本执行时可以传入参数,如: test.sh p1 p2
脚本中可以通过 1 − 9 , 1-9, 19,{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语句

单分支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条件语句

语法:

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语句

语法

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 语句

根据变量不同的取值,执行不同的命令操作
语法

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

猜你喜欢

转载自blog.csdn.net/zhangxm_qz/article/details/109231463