学习总览
- Vim文本编辑器
- 编写Shell脚本
- 流程控制语句
- 计划任务服务程序
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
该命令的效果如下:
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
该命令的效果如下:
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
该命令的效果如下:
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
该命令的效果如下:
计划任务服务程序
计划任务,可以分为一次性任务和定时任务。
一次性任务
一次任务是通过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
以上命令的实际效果图如下: