Vim编辑器与Shell命令脚本---Linux就该这么学(三)

版权声明: https://blog.csdn.net/UtopiaOfArtoria/article/details/79871141

Vim编辑器与Shell命令脚本—Linux就该这么学(三)

学习总览

  • Vim文本编辑器
  • 编写Shell脚本
  • 流程控制语句
  • 计划任务服务程序

Vim文本编辑器

Vim的三种模式

  • 命令模式:控制光标,增强对文本的复制、粘贴、删除和查找功能。
  • 编辑模式:文本录入。
  • 末行模式:保存或退出,设置编辑环境。

三种模式的切换如下图:

Vim模式切换

默认进入的就是命令模式,命令模式下的常用命令如下:

命令 作用
dd 删除(剪切)光标所在整行
yy 复制光标所在整行
u 撤销上一步的操作
p 将之前删除(dd)或复制(yy)过的数据粘贴到光标后面

保存或退出,需要先进入末行模式。末行模式的常用命令如下:

命令 作用
: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
?字符串 在文本中从下至上搜索该字符串
/字符串 在文本中从上至下搜索该字符串

编写Shell脚本

Shell终端解释器可以看做人与计算机硬件之间的“翻译官”,它作为用户与 Linux系统内部的通信媒介,除了能够支持各种变量与参数外,还提供了诸如循环、分支等高级编程语言才有的控制结构特性。

Shell脚本命令的工作方式有两种:

  • 交互式:用户每输入一条命令立即执行;
  • 批处理:用户事先编写好一个完整的Shell脚本,Shell一次性执行其中的所有命令。

编写一个简单的Shell脚本

执行如下命令:

# 用Vim文本编辑器,新建一个learnshell1.sh文件
vim learnshell1.sh
# 定义其内容如下:

#!/bin/bash
# this is a shell script
pwd
ls -a -l

# 保存退出后,执行该脚本的两种方式
# 方式一:直接bash解释器执行该脚本
bash learnshell1.sh
# 方式二:先授权,再执行该脚本
chmod u+x learnshell1.sh
./learnshell1.sh

该命令的效果图如下:

执行简单脚本

注意:脚本的第一行必须是(#!/bin/bash),声明这是一个脚本文件。

Shell脚本是如何接收参数的

执行如下命令:

# 用Vim文本编辑器,新建一个learnshell2.sh文件
vim learnshell2.sh
# 定义其内容如下:

#!/bin/bash
# this is a shell script to learn how to use variable
echo "当前脚步名称为$0"
echo "总共传进来的变量个数为$#。"
echo "它们分别是$*。"
echo "第二个变量为$2,第五个变量为$5。"

# 保存退出后,通过如下方式执行脚本
bash learnshell2.sh one two three four five six

该命令的效果图如下:

脚本使用参数

通过效果图,可以看出:$n,就是脚本获取命令中输入的第n个参数。$0即第0个参数就是脚本的名称,$#是获取命令中有多少个参数,$*是一次性获取所有的参数。

判断用户输入的参数

Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字 0,否则便返回其他随机数值。按测试对象可以分为:

  • 文件测试语句
  • 逻辑测试语句
  • 整数值比较语句
  • 字符串比较语句

文件测试语句

文件测试语句可使用的参数如下:

参数 作用
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行

测试用的命令如下:

# 测试(/home/learnCSPP)是否为目录
[ -d /home/learnCSPP ]
echo $?

# 测试(/home/learnCSPP/hello)是否为普通文件
[ -f /home/learnCSPP/hello ]
echo $?

# 测试(/home/learnCSPP/learnshell1.sh)是否为普通文件
[ -f /home/learnCSPP/learnshell1.sh ]
echo $?

# 测试(/home/learnCSPP/hello)是否有写入权限
[ -w /home/learnCSPP/hello ]
echo $?

# 测试(/home/learnCSPP/learnshell2.sh)是否有执行权限
[ -x /home/learnCSPP/learnshell2.sh ]
echo $?

# 测试(/home/learnCSPP/test)是否为目录
[ -d /home/learnCSPP/test ]
echo $?

该命令的效果如下:

文件测试

逻辑测试语句

逻辑语句用于对测试结果进行逻辑分析,根据测试结果可实现不同的效果。逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令;逻辑“或”的运算符号是||,它表示当前面的命令执行失败后才会执行它后面的命令;逻辑“非”的运算符号是!,把条件测试中的判断结果取相反值。

测试用的命令如下:

# 如果hello是一个可执行文件,就在终端打印echo中的内容
[ -x hello ] && echo "hello 是一个可执行文件"

# 如果test是一个目录,就在终端打印echo中的内容
[ -d test ] && echo "test 不是一个目录"

# 如果test不是一个目录,就在终端打印echo中的内容
[ -d test ] || echo "test 不是一个目录"

# 如果test不是一个目录,就在终端打印echo中的内容
[ ! -d test ] && echo "一个结果为错误的命令,逻辑非后,即该命令是正确的。所以紧随其后逻辑与的命令会执行"

该命令的效果如下:

逻辑语句

整数值比较语句

可用的整数比较符号如下:

运算符 作用
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于或小于
-ge 是否大于或等于

测试用的命令如下:

# 如果参数1(10)等于参数2(10)为真,就在终端打印echo后的内容
[ 10 -eq 10 ] && echo "10等于10"

# 如果参数1(10)大于参数2(10)为真,就在终端打印echo后的内容
[ 10 -gt 8 ] && echo "10大于8"

# 如果参数1(10)小于参数2(8)为假,就在终端打印echo后的内容
[ 10 -lt 8 ] || echo "10小于8"

该命令的效果如下:

整数值比较

字符串比较语句

常见的字符串比较运算符如下:

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

测试用的命令如下:

# 定义了变量STR,其值为abc
STR="abc"

# 如果变量STR的值为abc,就在终端打印echo后的内容
[ $STR = "abc" ] && echo "变量STR的值为abc"

# 如果变量STR的值不为cba,就在终端打印echo后的内容
[ $STR = "cba" ] || echo "变量STR的值为cba"

# 如果变量STR不为空,就在终端打印echo后的内容
[ -z $STR ] || echo "变量STR不为空"

该命令的效果如下:

字符串比较

流程控制语句

流程控制语句有4种:if,for,while,case

if条件测试语句

if条件测试语句的格式为:if [ 判定条件 ] then 命令语句 fi,可以解释为如果判定条件为真,则执行命令语句。

测试用的命令如下:

# 新建一个learnif文件
vim learnif.sh

#编辑其内容如下:
#!/bin/bash
# this is a shell script to learn how to use if.

if [ $1 -ge 90 ]
then echo "大于或等于90,所以是优秀"
elif [ $1 -ge 70 ]
then echo "在70-90之间,所以是良好"
elif [ $1 -ge 60 ]
then echo "在60-70之间,所以是及格"
else
echo "小于60,所以是不及格"
fi

# 保存退出后,可以用类似如下命令进行测试:
bash learnif.sh 95

该命令的效果如下:

流程控制-if语句

for条件循环语句

for条件循环语句的格式为:for 变量名 in 取值列表 do 命令($获取当前循环变量的值) done。详情见测试案例。

测试用的命令如下:

# 新建一个user.txt的文本
vim user.txt

# 编辑其文本如下:
andy
barry
carl
duke
eric
george

# 保存退出后,新建一个learnfor.sh的文本
vim learnfor.sh

# 编辑其文本如下:
#!/bin/bash
# This is s shell script to learn how to use for.

echo "users.txt中的内容如下:"

for UNAME in `cat users.txt`
do
  echo "$UNAME"
done

read -p "您输入一个用户,系统检测你输入的用户是否在user.txt中: " INPUT
FLAG=1
for UNAME in `cat users.txt`
do
  if [ $UNAME = $INPUT ]
  then
    FLAG=0
    echo "你输入的是$INPUT,在user.txt中"
  fi
done

if [ $FLAG -eq 1 ]
then
  echo "你输入的$INPUT,不在user.txt中"
fi

# 通过如下命令测试(键入carl、text可看到不同的输出)
bash learnfor.sh

该命令的效果如下:

流程控制-for语句

while条件循环语句

while条件循环语句格式:while 判定条件 do 命令 done,详情见案例。

测试命令如下:

# 新建一个learnwhile.sh的文本
vim learnwhile.sh

#编辑其文本如下:
#!/bin/bash
# 这是一个猜数字游戏,用来学习while语句用法

echo "你将要猜的是一个0-999的数字,系统会记录你直至猜中的轮次数。"

NUM=$(expr $RANDOM % 1000)
TIMES=0
while true
do
  read -p "请输入你猜的数字: " GUESS
  let TIMES++
  if [ $NUM -eq $GUESS ]
  then
    echo "恭喜您猜中了,您只猜了$TIMES轮就猜中了"
    exit 0
  elif [ $NUM -gt $GUESS ]
  then
    echo "太小了,需要一个更大的数字"
  else
    echo "太大了,需要一个更小的数字"
  fi
done

# 通过该命令运行该脚本(用0-999中的数字测试)
bash learnwhile.sh

该命令的效果如下:

流程控制-while语句

case条件测试语句

case语句的格式如下:case 变量值 in 范围1) 命令1 ;; … *) 命令n+1 ;; esac,详情见案例。

测试用的命令如下:

# 新建一个learncase.sh的文本
vim learncase.sh

# 编辑其内容如下:
#!/bin/bash
# 这是一个用来学习case语法的案例

read -p "请您在输入一个字符: " CHAR

case $CHAR in
[0-9])
  echo "你输入的是一个数字"
  ;;
[a-z]|[A-Z])
  echo "你输入的是一个英文字母"
  ;;
*)
  echo "你输入的是其他的特殊字符"
  ;;
esac

# 通过如下命令运行该脚本,并测试
bash learncase.sh

该命令的效果如下:

流程控制-case语句

计划任务服务程序

计划任务,可以分为一次性任务和定时任务。

一次性任务

一次任务是通过at的服务实现的。

# 通过yum命令安装at工具
yum install at
# 启动atd服务
systemctl start atd.service
# 查看现在有多少个一次性定时任务
at -l
# 删除还未执行的一次性定时任务
atrm $id

# 设定在16:28创建目录learnAt
at 16:28
at> mkdir learnAt
# CTRL + D组合建退出一次性定时任务的设置

该命令的效果图如下:

计划任务-一次性

定时任务

默认启用的crond服务,可以实现定时任务。定义定时任务的格式为:
分 时 日 月 星期 命令。如果不需要限制,用*作为代替进行占位。

这里的分、时、日、月、星期对应的范围如下:

字段 含义
0-59的整数
0-23的整数
0-31的整数
1-12的整数
星期 0-7,0和7都是星期天

crond服务相关的命令如下:

  • crontab -e 创建或编辑定时任务
  • crontab -l 列出当前用户设置的定时任务
  • crontab -r 删除选中的定时任务

现在做一个定时任务:每隔一分钟向文件(/home/learnCSPP/learnschedule)中追加当前时间,详情见命令如下:

# 看crond服务是否处于运行状态,如果不是的话,需要启动
systemctl status crond.service
# 预先创建存日期的目标文件
touch /home/learnCSPP/learnschedule
# 查看当前的计划定时任务
crontab -l
# 编辑计划定时任务
crontab -e

# 编辑如下(即每隔一分钟向/home/learnCSPP/learnschedule追加当前时间)
* * * * * date >> /home/learnCSPP/learnschedule

# 保存退出后,隔几分钟后看/home/learnCSPP/learnschedule的内容
cat /home/learnCSPP/learnschedule

# 通过以下命令可以删除定时任务
crontab -r

以上命令的实际效果图如下:

计划任务-定时执行

猜你喜欢

转载自blog.csdn.net/UtopiaOfArtoria/article/details/79871141