《Linux就该这么学》第四章
条评论主要内容
- Vim 文本编辑器
- 编写 Shell 脚本
- 流程控制语句
- 计划任务服务程序
Vim 文本编辑器
1 | 在 Linux 中,一切都是文件,而配置一个服务就是在修改器配置文件的参数。 |
- 三种模式
- 命令模式:控制光标移动,对文本进行复制、粘贴、删除和查找等操作
- 输入模式:正常的文本录入
- 末行模式:保存或退出文档,以及设置编辑环境
- 流程
- 每次运行 Vim,默认是命令模式
- 先切换(
a
、i
、o
)输入模式进行文本编写 - 然后(
esc
)返回命令模式 - 再进入(
:
)末行模式进行保存或退出 - 无法从输入模式直接切换到末行模式
- Vim 常用命令
序号 命令 作用 1 dd 删除(剪切)光标所在整行 2 5dd 删除(剪切)从光标处开始的5行 3 yy 复制光标所在整行 4 5yy 复制从光标处开始的 5 行 5 n 搜索结果,下一个 6 N 搜索结果,上一个 7 u 撤销上一步的操作 8 p 将之前删除(dd)或复制的(yy)的数据粘贴到光标后 - 末行模式
- 输入
:
即可进入该模式 - 该模式主要用于保存或退出文件
- 设置 Vim 编辑器的工作环境
- 让用户执行外部的 Linux 命令
- 跳转指定的行数
序号 命令 作用 1 :w 保存 2 :q 退出 3 :q! 放弃对文档的修改,强制退出 4 :wq! 强制保存退出 5 :set nu 显示行号 6 :set nonu 不显示行号 7 :命令 执行输入的命令,包括外部命令 8 : 整数 跳转指定行 9 :s/one/two 将当前光标所在行的第一个 one 替换成 two 10 :s/one/two/g 将当前光标所在行的所有 one 替换成 two 11 :%s/one/two/g 将全文中的所有 one 替换成 two 12 :/字符串 在文本中从上至下搜索该字符串 13 :?字符串 在文本中从上至下搜索该字符串
- 输入
编写简单文档
命令模式切换输入模式
a
:append,在光标后一位进行输入i
:insert,在光标前一位进行输入o
:换行输入
配置主机名称
略
配置网卡信息
略
注:笔者用的 Centos 7.5,虚拟机,与原著作者书中的案例不同
配置 Yum 软件仓库
略
关于 Yum,笔者会另起一篇文章。
编写 Shell 脚本
- 交互式(Interactive):输入一条,执行一条
- 批处理(Batch):实现编写好一个完整的脚本,一次执行脚本中的诸多命令
编写简单 Shell 脚本
1 | vim simple.sh |
接受用户输入参数
$0 标识脚本名称
$# 标识参数数量
$n 位置 N 的参数值
$* 所有参数
$? 显示上一次命令的执行返回值
案例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19vim simple_input.sh
# 输入
echo "当前脚本名称 $0"
echo "一共有 $# 个参数,分别是 $*"
echo "第一个参数是 $0,第二个参数是$3"
~
# 权限
chmod u+x simple_input.sh
# 执行
./simple_input.sh 1 2 3 4
# 输出
# 当前脚本名称 ./simple_input.sh
# 一共有 4 个参数,分别是 1 2 3 4
# 第一个参数是 ./simple_input.sh,第二个参数是3
判断用户参数
- Shell 脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字 0,否则便返回其他随机数值
- 格式:
[ 条件表达式 ]
- 注意:中括号的边上有一个空格,务必保留
- 结果:
0
为真> 0
为假,具体值可能为1,可能为2,具体看系统版本(原著,笔者环境为 1)
- 分类:
- 文件测试语句
- 逻辑测试语句
&&
与运算!
非运算||
或运算
- 整数值测试语句
- 字符串比较语句
文件测试语句
序号 | 运算符 | 作用 |
---|---|---|
1 | -d | 测试文件是否为目录类型 |
2 | -e | 测试文件是否存在 |
3 | -f | 测试是否为一般文件 |
4 | -r | 测试当前用户是否有权限读取 |
5 | -w | 测试当前用户是否有权限写入 |
6 | -x | 测试当前用户是否有权限执行 |
案例:
1 | # && 与操作,|| 或操作,失败后执行 |
整数值测试语句
序号 | 运算符 | 作用 |
---|---|---|
1 | -eq | 是否等于 |
2 | -ne | 是否不等于 |
3 | -gt | 是否大于 |
4 | -lt | 是否小于 |
5 | -le | 是否等于或小于 |
6 | -ge | 是否等于或大于 |
案例一:
1 | # 其他的运算符与之类似 |
案例二:
1 | # 获取内存余量,判断是否充足(余量 < 1024M) |
字符串比较语句
序号 | 运算符 | 作用 |
---|---|---|
1 | = | 比较字符串是否相同 |
2 | != | 比较字符串是否不同 |
3 | -z | 判断字符串是否为空 |
案例一:
1 | # 判断 String 是否为空 |
案例二:
1 | echo $LANG |
流程控制语句
一共有四种 if
、for
、while
、case
if
语句
单分支结构
语法
1
2
3if 条件测试操作
then 命令序列
fi案例:检查并创建目录
1
2
3
4
5vim sample_check_dir.sh
# 赋予权限
chmod u+x ./sample_check_dir.sh
# 执行
./sample_check_dir.sh脚本:sample_check_dir.sh 1
2
3
4
5
6
7
8
9
10# 输入一下内容:
DIR="/root/fileTest/fileTestDeep"
# 判断目录是否存在
if [ ! -e $DIR ]; then
# 创建测试目录
mkdir -p $DIR
# 列出目录文件
ls /root
fi
双分支结构
- 语法:
1
2
3
4if 条件测试操作
then 命令序列1
else 命令序列2
fi - 案例:
1
2
3
4
5
6
7
8
9
10
11
12# 编辑
vim sample_check_host.sh
# 赋予权限
chmod u+x ./sample_check_host.sh
# 执行
# Please input host.
./sample_check_host.sh
# Host 127.0.0.1 is On-line.
./sample_check_host.sh 127.0.0.1
# Host 256.0.0.1 is Off-line.
./sample_check_host.sh 256.0.0.1脚本:sample_check_host.sh 1
2
3
4
5
6
7
8
9
10
11
12
# 判断是否输入了测试 ip
if [ ! -z $1 ]
then
ping -c 3 -i 0.2 -W 3 $1 &> /dev/null
if [ $? -eq 0 ]; then
echo "Host $1 is On-line."
else
echo "Host $1 is Off-line."
fi
else echo "Please input host."
fi
- 语法:
多分支结构
- 语法
1
2
3
4
5
6
7if 条件测试操作1
then 命令序列1
elif 条件测试操作2
then 命令序列2
else
命令序列3
if - 案例
1
2
3
4
5
6
7# 编辑
vim sample_check_score.sh
# 赋予权限
chmod u+x ./sample_check_score.sh
# 执行
./sample_check_score.sh脚本:sample_check_score.sh 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 读入成绩
read -p "输入你的成绩:" GRADE
# 分支判断
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ]; then
echo "$GRADE 分 非常棒"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ]; then
echo "$GRADE 分 通过"
elif [ $GRADE -ge 100 ] || [ $GRADE -le 0 ]; then
echo "分数不合法"
else
echo "$GRADE 分 未通过"
fi
- 语法
for
语句
- 语法
1
2
3for 变量名 in 取值列表; do
命令序列
done - 案例
脚本:sample_check_host_loop.sh 1
2
3
4
5
6
7
8
9
10
11
12
13
# 从文件读取 hostlist
HOST_LIST=$(cat /root/ip_addrs.txt)
# 循环 ping
for host in $HOST_LIST; do
ping -c 3 -i 0.2 -W 3 $host &> /dev/null
if [[ $? -eq 0 ]]; then
echo "Host $host is On-line"
else
echo "Host $host is Off-line"
fi
done
while
语句
- 语法
1
2
3while [[ 条件测试操作 ]]; do
命令序列
done - 案例
脚本:sample_game_guess_number.sh 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "猜猜看数字是多少"
while true; do
read -p "请输入您猜的数字:" PRICE_IN
let TIMES++
if [[ $PRICE_IN -eq $PRICE ]]; then
echo "正确数字 $PRICE,一共猜了 $TIMES 次"
exit 0
elif [[ $PRICE_IN -gt $PRICE ]]; then
echo "大了一些"
else
echo "小了一些"
fi
done
case
语句
- 语法
1
2
3
4
5
6
7
8
9
10case 变量值 in
模式1 )
命令序列1
;;
模式2 )
命令序列2
;;
*)
默认命令序列
esac - 案例
脚本:sample_check_char.sh 1
2
3
4
5
6
7
8
9
10
11
12
13
14
read -p "输入一个字符:" KEY
case $KEY in
[a-z]|[A-Z] )
echo "字母"
;;
[0-9] )
echo "数字"
;;
*)
echo "其他种类字符"
esac
计划任务服务程序
一次性任务
- 命令:at
- 注意:
at: 未找到命令
:执行yum install at
No atd running?
:执行systemctl start at
- 参数
序号 运算符 作用 1 -f 指定包含具体指令的任务文件 2 -q 指定新任务的队列名称 3 -l 或 [atq](http://man.linuxde.net/atq) 显示待执行任务的列表 4 -d 或 [atrm](http://man.linuxde.net/atrm) 删除指定的待执行任务 5 -m 任务执行完成后向用户发送E-mail - 案例
案例at 1
2
3
4
5
6at 12:30
> /bin/ls
> ctrl+d 结束输入
# 执行后,会提示:您在 /var/spool/mail/root 中有新邮件
# 邮件就是 命令的执行结果
周期性任务
命令:crontab
注意:
- 在 crond 服务的配置参数中,可以像 Shell 脚本那样以#号开头写上注释信息,方便阅读理解
- 计划任务中的 “minute” 字段必须有数值,绝对不能为空或是*号
- “day” 和 “week” 字段不能同时使用,否则就会发生冲突。
说明:系统默认安装,自动启动 crond 进程,每分钟检测。
格式:
minute hour day month week command
,顺序:分 时 日 月 周
在以上各个字段中,还可以使用以下特殊字符:运算符 作用 minute 表示分钟,可以是从 0 到 59 之间的任何整数 hour 表示小时,可以是从 0 到 23 之间的任何整数 day 表示日期,可以是从 1 到 31 之间的任何整数 month 表示月份,可以是从 1 到 12 之间的任何整数 week 表示星期几,可以是从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日 command 要执行的命令,可以是系统命令,也可以是自己编写的脚本文件 字符 作用 \* 代表所有可能的值
例如 month 字段是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作, 可以用逗号隔开的值指定一个列表范围
例如,“1,2,5,7,8,9”- 可以用整数之间的中杠表示一个整数范围
例如 “2-6” 表示 “2,3,4,5,6”/ 可以用正斜线指定时间的间隔频率
例如 “0-23/2” 表示每两小时执行一次。
\--\--\--\--
同时正斜线可以和星号一起使用
例如 */10,如果用在 minute 字段,表示每十分钟执行一次。命令选项
序号 运算符 作用 1 -e 编辑该用户的计时器设置 2 -l 列出该用户的计时器设置 3 -r 删除该用户的计时器设置 4 -u<用户名称> 指定要设定计时器的用户名称 案例:
案例crontab 1
2
3
4
5
6
7
8# 每 1 分钟执行一次 command
* * * * * command
# 每小时的第 3 和第 15 分钟执行
3,15 * * * * command
# 每小时执行任务
* */1 * * * command
# 一月一号的 4 点执行任务
0 4 1 jan * command
附录
写在最后
版本 | 内容 | 时间 |
---|---|---|
v1.0.0 | 1. 创建文档 2. 第四章阅读笔记草稿 | 2018-09-18 22:08:06 |
v1.0.1 | 1. 继续编写第四章阅读笔记草稿 | 2018-10-12 16:28:21 |
v1.0.2 | 1. 第四章阅读笔记完成,并完成校验 | 2018-10-13 17:20:47 |
本文标题:《Linux就该这么学》第四章
文章作者:LeerGo
发布时间:2018-09-18
最后更新:2020-05-29
原始链接:https://blog.bugfix.fun/2018/09/18/29256.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!