第4章 Vim编辑器与Shell命令脚本
1. Vim文本编辑器
Vim编辑器中设置了三种模式——命令模式、末行模式和输入(编辑)模式。在每次运行Vim编辑器时,默认进入命令模式,此时需要先切换到输入模式再进行文档编辑工作。而每次在编写完文档后需要先返回命令模式,然后再进入末行模式,执行文档的保存或退出操作。在Vim中,无法直接从输入模式切换到末行模式。
可以使用a、i、o
这三个键从命令模式切换到输入模式。其中,a
键与i
键分别是在光标后面一位和光标当前位置切换到输入模式,而o
键则是在光标的下面再创建一个空行。在编写完之后,要想保存并退出,必须先敲击键盘的Esc
键从输入模式返回命令模式。然后再输入:wq!
切换到末行模式才能完成保存退出操作。
命令模式中最常用的一些命令
命令 | 作用 |
---|---|
dd | 删除(剪切)光标所在整行 |
5dd | 删除(剪切)从光标处开始的5行 |
yy | 复制光标所在整行 |
5yy | 复制从光标出开始的5行 |
n | 显示搜索命令定位到的下一个字符串 |
N | 显示搜索命令定位到的上一个字符串 |
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 |
?字符串 | 在文本中从下至上搜索该字符串 |
/字符串 | 在文本中从上至下搜索该字符串 |
2. 编写Shell脚本
2.2 接收用户的参数
Linux系统中的Shell脚本内设了用于接收参数的变量,变量之间使用空格间隔。例如,$0
对应的是当前Shell脚本程序的名称,$#
对应的是总共有几个参数,$*
对应的是所有位置的参数值,$?
对应的是显示上一次命令的执行返回值,而$1、$2、$3......
则分别对应着第N个位置的参数值。
[root@linuxprobe ~]# vim example.sh
echo "The .sh file name is $0."
echo "There are $# arguments, they are $*."
echo "The first argument is $1, the fifth argument is $5."
[root@linuxprobe ~]# bash example.sh one two three four five six
The .sh file name is example.sh.
There are 6 arguments, they are one two three four five six.
The first argument is one, the fifth argument is five.
2.3 判断用户的参数
Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回非零值。条件测试语法的执行格式为测试语句格式:[ 条件表达式 ]
。切记,条件表达式两边均应有一个空格。
文件测试所用的参数
运算符 | 作用 |
---|---|
-d | 测试文件是否为目录类型 |
-e | 测试文件是否存在 |
-f | 判断是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
可用的整数比较运算符
运算符 | 作用 |
---|---|
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
常见的字符串比较运算符
运算符 | 作用 |
---|---|
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空 |
3. 流程控制语句
3.1 if条件测试语句
[root@linuxprobe ~]# vim chkscore.sh
#!/bin/bash
read -p "Enter your score (0-100) : " GRADE
if [ $GRADE -gt 100 ] || [ $GRADE -lt 0 ] ; thenecho "$GRADE is error."
elif [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; thenecho "$GRADE is excellent."
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; thenecho "$GRADE is pass."
elseecho "$GRADE is fail."
fi
3.2 for条件循环语句
[root@linuxprobe ~]# vim chkhost.sh
#!/bin/bash
HOSTLIST=$(cat~/ipaddrs.txt)
for ip in $HOSTLIST
doping -c 3 -i 0.2 -W 3 $IP &> /dev/nullif [ $? -eq 0 ]then echo "Host $IP is Online."elseecho "Host $IP is Offline."fi
done
3.3 while条件循环语句
[root@linuxprobe ~]# vim Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "The real price is between 0 and 999, please guess how much the price is."
while true
doread -p "Enter the price you guessed : " INTlet TIMES++if [ $PRICE -eq $INT ] ; thenecho "Congratulations! The real price is $PRICE."echo "You have guessed $TIMES times."exitelif [ $INT -gt $PRICE ] ; thenecho "You guessed too high."elseecho "You guessed too low."fi
done
3.4 case条件测试语句
[root@linuxprobe ~]# vim chkkeys.sh
#!/bin/bash
read -p "Please enter a character and press enter to confirm." KEY
case "$KEY" in[a-z]|[A-Z])echo "You entered a character.";;[0-9])echo "You entered a number.";;*)echo "You entered somethingelse"
esac
4. 计划任务服务程序
at命令中的参数及其作用
参数 | 作用 |
---|---|
-f | 指定包含命令的任务文件 |
-q | 指定新任务名称 |
-l | 显示待执行任务的列表 |
-d | 删除指定的待执行任务 |
-m | 任务执行后向用户发邮件 |
crontab命令中的参数及其作用
参数 | 作用 |
---|---|
-e | 编辑计划任务 |
-u | 指定用户名称 |
-l | 列出任务列表 |
-r | 删除计划任务 |
使用crond设置任务的参数字段说明
字段 | 说明 |
---|---|
分钟 | 取值为0~59的整数 |
小时 | 取值为0~23的任意整数 |
日期 | 取值为1~31的任意整数 |
月份 | 取值为1~12的任意整数 |
星期 | 取值为0~7的任意整数,其中0与7均为星期日 |
命令 | 要执行的命令或程序脚本 |
复习题
-
Vim编辑器的3种模式分别是什么?
命令模式、输入模式、末行模式 -
怎么从输入模式切换到末行模式?
先按Esc
切换到命令模式,然后按:
切换到末行模式 -
一个完整的Shell脚本应该包含哪些内容?
脚本声明、注释信息和可执行语句(命令) -
分别解释Shell脚本中$0与$3变量的作用。
Shell脚本的名字和第三个参数 -
if条件测试语句有几种结构,最灵活且最复杂的是哪种结构?
if条件测试语句包括单分支、双分支与多分支等三种结构,其中多分支结构是最灵活且最复杂的结构,其结构形式为if...then...elif...then...else...fi
-
for条件循环语句的循环结构是什么样子的?
for 变量名 in 取值列表 do 命令序列 done
-
若在while条件循环语句中使用true作为循环条件,那么会发生什么事情?
循环不会停止 -
如果需要依据用户的输入参数执行不同的操作,最方便的条件测试语句是什么?
case
条件测试语句 -
Linux系统的长期计划任务所使用的服务是什么,其参数格式是什么?
长期任务计划需要使用crond
服务程序,参数格式是分时日月星期命令