Linux基础(3) Vim编辑器与Shell命令脚本

1、VIM文本编辑器

  • VIM编辑器的三大模式
  1. 命令模式: 控制光标移动,可对文本进行复制、粘贴和查找等工作
  2. 输入模式: 正常的文本录入。
  3. 末行模式: 保存或退出文档,以及设置编辑环境
  4. 三种模式的切换
    请添加图片描述
    注意: 命令模式切换到输入模式的3种方法:1、a键:在光标的后一位切换到输入模式。2、i键:在光标的当前位置切换到输入模式。3、o键:在光标的下面再创建一个空行,并切换到输入模式,一般常用于文件追加操作中。
  • 命令模式常用命令
命令作用
dd删除(剪切)光标所在的整行
5dd删除(剪切)光标处开始的5行
yy复制光标所在整行
5yy复制从光标处开始的5行
p将之前剪切或者复制过的数据粘贴到光标后面
u撤销上一步操作
n显示搜索命令定位到的下一个字符串(结合末行模式的搜索字符串命令)
N显示搜索命令定位到的上一个字符串(结合末行模式的搜索字符串命令)
  • 末行模式常用命令
命令作用
:wq!写入 -> 退出 -> 强制 ,使用时可排列组合
:set nu显示行号
:set nonu不显示行号
:命令执行该命令
:整数跳转到该行
?字符串在本文中从下至上搜索该字符串
/字符串在本文中从上至下搜索该字符串
: s/one/two将当前光标所在行的第一个one替换成two
: s/one/two/g将当前光标所在行的所有one替换成two
: %s/one/two/g将全文中所有的one替换成two
  • 小知识

    ​1. 主机名大多存放在/etc/hostname中,可通过vim编辑器编辑文件中的内容来更改主机名。

2、编写Shell脚本

  • Shell脚本的工作方式

    1. 交互式(interactive):用户输入一条命令就立即执行。

    2. 批处理(Batch):用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中的诸多命令。

    eg: 查看当前命令行终端解释器

    echo $SHELL #打印结果:/bin/bash 表明系统已经默认使用Bash作为命令行终端解释器了
    
  • 编写简单的脚本

    eg: 使用命令vim example.sh生成一个Shell脚本文件,最好添加.sh后缀,文件内容如下:

    #!/bin/bash
      #This is a simple example
      pwd
      ls -l
    

    ​其中,脚本声明#!告诉系统使用的Shell解释器,注释信息#对脚本的信息进行介绍,其他内容则是相应的Linux命令。

  • 运行Shell脚本文件
    eg:bash example.sh

    使用Bash解释器直接运行Shell脚本文件。

    eg:./example.sh

    直接输入完整的路径来执行脚本文件。

  • 接收用户的参数

    eg: 使用命令vim example.sh生成一个Shell脚本文件,文件内容如下:

    #!/bin/bash
    echo "当前的脚本名称为$0"
    echo "总共有$#个参数,分别是$*"
    echo "第一个参数为$1,第五个参数为$5"
    

    执行命令bash example.sh 1 2 3 4 5后,最后的执行结果为:

    当前的脚本名称为example.sh
    总共有5个参数,分别是1 2 3 4 5
    第一个参数为1,第五个参数为5
    

    其中$0对应当前Shell脚本程序的名称,$1、$2、$3...分别对应着第N个位置的参数值,$#对应参数的个数,$*对应的是所有位置的参数值,$?对应的是显示上一次命令的执行返回值。

  • 判断用户的参数

    测试语句的格式为[ 条件表达式 ],注意方括号和条件表达式之间有空格。Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回非零值

    条件测试语句可以分为4种:

    1. 文件测试语句
    2. 逻辑测试语句
    3. 整数值比较语句
    4. 字符串比较语句
  • 文件测试语句

    eg: 测试文件是否为目录类型

    [ -d /etc/fstab ] #第一次执行
    echo $? #第二次执行
    

    输出结果为1,表明文件/etc/fstab不是目录,或这个目录不存在
    eg: 测试文件是否为一般文件

    [ -f ./example.sh ] #第一次执行
    echo $? #第二次执行
    

    输出结果为0,表明文件存在,且为一般文件。
    eg: 测试文件是否存在

    [ -f ./xxxxxx ] #第一次执行
    echo $? #第二次执行
    

    输出结果为1,表明文件不存在

    文件测试所用的参数如下:

    运算符作用
    -d测试文件是否为目录类型
    -e测试文件是否存在
    -f判断是否为一般文件
    -r测试当前用户是否有权限读取
    -w测试当前用户是否有权限写入
    -x测试当前用户是否有权限执行
  • 逻辑测试语句

    eg: 测试文件是否为目录类型

    [ ! -d /etc/fstab ] || echo "dir" && echo "Not a dir"
    

    输出结果为Not a dir,表明文件/etc/fstab不是目录,或这个目录不存在。执行顺序:语句[ ! -d /etc/fstab ]返回,则不执行||后的操作,而转去执行&&后操作,即输出Not a dir

    逻辑测试所用的参数如下:

    运算符作用
    &&只有当前面的语句为真,才执行后面的语句
    ||只有当前面的语句为假,才执行后面的语句
    逻辑测试结果取反
  • 整数值比较语句

    eg: 比较两个数的大小

    [ 1 -lt 2 ] && echo "True" || echo "False"
    

    输出结果为True,表明12小。

    逻辑测试所用的参数如下:

    运算符作用
    -eq是否等于
    -ne是否不等于
    -gt是否大于
    -lt是否小于
    -le是否等于或小于
    -ge是否大于或等于
  • 字符串比较语句

    eg: 比较两个字符串是否相同

    [ $USER = lh ] && echo "user is lh" || echo "user is not lh"
    

    输出结果为user is lh,证明此时用户名称为lh

    字符串测试所用的参数如下:

    运算符作用
    =比较字符串内容是否相同
    !=比较字符串内容是否不同
    -z判断字符串内容是否为空

3、流程控制语句

  • if测试语句

    1. 单分支结构
    if 条件测试语句
    	then 命令序列
    fi
    
    1. 双分支结构
    if 条件测试语句
    	then 命令序列1
    	else 命令序列2
    fi
    
    1. 多分支结构
    if 条件测试语句1
    	then 命令序列1
    elif 条件测试语句2
    	then 命令序列2
    else
    	命令序列3
    fi
    

    eg: 测试某台主机是否在线

    1.使用命令vim checkhost.sh新建一个shell脚本,在脚本中编辑:

    #!/bin/bash
    ping -c 3 -i 0.2 -W 3 $1 &> /dev/null # -c:尝试的次数 -i:每个数据的发送间隔 -W:等待时间
    # 文件/dev/null被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删除数据。
    if [ $? -eq 0 ] 
    then
            echo "Host $1 is On-line"
    else
            echo "Host $1 is Off-line"
    fi
    

    2.测试该脚本

    bash checkhost.sh 127.0.0.1 #测试本地环回地址,最终屏幕打印:Host 127.0.0.1 is On-line
    bash checkhost.sh 192.168.123.123 #随便测试一个地址,最终屏幕打印:Host 192.168.123.123 is Off-line
    
  • for语句

    for语句语法格式

    for 变量名 in 取值列表
    do
    	命令序列
    done
    

    eg:使用for循环语句从列表文件中读取多个用户名,然后为其逐一创建用户账户并设置密码。
    ​1.使用命令vim users.txt新建用户列表:

    andy
    barry
    carl
    duke
    eric
    george
    

    2.编写shell脚本addusers.sh

    #!/bin/bash
    read -p "Enter The Users Password:" PASSWD #脚本中使用read命令读取用户输入的密码,并赋值给PASSWD
    for UNAME in `cat users.txt`
    #上面这句亦可以修改成:
    #List = $(cat users.txt)
    #for UNAME in $List
    do
            id $UNAME &> /dev/null #"id 用户名"命令用于查看用户的信息
            if [ $? -eq 0 ]
            then
                    echo "$UNAME,Already exists"
            else
                    useradd $UNAME
                    echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null #密码传递
                    echo "$UNMAE ,Create sucess"
            fi
    done
    

    3.执行脚本并输入相应的密码,屏幕中显示创建成功的信息,利用tail -6 /etc/passwd命令可以查看新建的用户信息。

  • while条件循环语句

    while语句语法格式

    while 条件测试判断
    do
    	命令序列
    done
    

    eg:猜数字小游戏

    #!/bin/bash
    #猜测数字游戏
    REALNUM=$(expr $RANDOM % 1000)  # expr语句用于表示表达式,具体用法自行查询
    TIMES=0  # 猜测的次数
    
    while true
    do
            read -p "请输入你猜测的数字(0-999):" INT 
            let TIMES++ 
    
            if [ $INT -gt $REALNUM ]
            then
                    echo "你输入的数字太大了"
            elif [ $INT -eq $REALNUM ]
            then
                    echo "恭喜你,这个数字就是 $INT"
                    echo "本局你已经猜测了 $TIMES 次了"
                    exit   #切记:退出while循环时一定要使用exit命令
            else
                    echo "你输入的数字太小了"
            fi
    done
    
  • case条件测试语句

    case语句语法格式

    case 变量值 in
    模式1)
    	命令序列1
    	;;
    模式2)
    	命令序列2
    	;;
    	......
    *)
    	默认命令序列
    esac
    

    eg: 判断输入的字符类型

    #!/bin/bash
    read -p "请输入一个字符:" KEY 
    case $KEY in
            [A-Z]|[a-z])
                    echo "你输入的是字母"
                    ;;
            [0-9])
                    echo "你输入的是数字"
                    ;;
            *)
                    echo "你输入的是特殊字符"
    esac
    

4、计划任务服务程序

  • 计划的分类

    1. 一次性计划任务
    2. 长期性计划任务
  • 一次性计划任务

    eg: 使用交互式方法设置今晚23:30自动重启网站服务

    [lh@LH_LINUX]$ at 23:30
    warning: commands will be executed using /bin/sh
    at> systemctl restart httpd
    at> #使<CTRL>+<D>结束编写计划任务
    job 1 at Sat Mar 18 23:30:00 2023
    

    eg: 使用非交互式方法设置两小时后自动重启网站服务(使用管道命令)

    [lh@LH_LINUX]$ echo "systemctl restart httpd" | at now +2 HOUR
    warning: commands will be executed using /bin/sh
    job 3 at Sat Mar 18 20:38:00 2023
    

    时间参数MONTH(月)、DAY(日)、HOUR(时)和MINUTE(分)
    eg: 删除计划任务

    [lh@LH_LINUX]$ at -l #查看一次性任务
    3	Sat Mar 18 20:38:00 2023 a lh
    1	Sat Mar 18 23:30:00 2023 a lh
    [lh@LH_LINUX]$ atrm 3 #删除第3条任务
    
  • 长期性计划任务

    eg: 创建两个自动化任务

    1. 使用命令crontab -e编辑自动化任务,在VIM编辑器里写入

      25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot #每周一、三、五的3:25分将目录数据进行打包
      */2 * * * 1-5 /usr/bin/rm -rf /tmp/* #周一至周五每隔2分钟清空`/tmp`目录中的内容
      

      格式:“分、时、日、月、星期 命令”

      注意:,分别表示多个时间段,-表示一段连续的时间周期,/表示执行任务的时间间隔;计划中的“分”字段必须要有数值,“日”和“星期”字段不能同时使用,否则就会发生冲突

    2. 使用命令crontab -l可以再次查看自动化任务

    eg: 删除自动化任务

    使用命令crontab -r即可。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Elec Liu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值