《Linux就该这么学》--学习笔记(三)第四章 Vim编辑器与Shell命令脚本

4.1Vim文本编辑器

在Linux系统中一切都是文件,而配置一个服务就是在修改其配置文件的参数。
Vim编辑器三种模式:

  • 命令模式:控制光标移动,可对文本进行复制、粘贴、删除和查找等工作。
  • 输入模式:正常的文本录入。
  • 末行模式:保存或退出文档,以及设置编辑环境。
    在这里插入图片描述
  • 命令模式命令模式常用命令
    在这里插入图片描述
    在这里插入图片描述

4.1.1编写简单文档

a,i,o切换:

  • a:光标后面一位
  • i:光标当前位置
  • o:光标的下面再创建一个空行

在这里插入图片描述
修改后没有保存直接":q"会拒绝推出,要强制保存并退出。

4.1.2配置主机名称

主机之间可以通过主机名称这个类似于域名的名称来相互访问。Linux中主机名大多数保存在etc/hostname文件中

可以先通过file命令查看hostname文件是什么类型的

[linuxprobe@linuxprobe etc]$ file hostname 
hostname: ASCII text

4.1.3配置网卡信息

RHEL7中网卡配置文件前缀为ifcfg开始,名字忘了可以用ifconfig查看。

在这里插入图片描述
注:要进行修改之前,用ls -l查看文件的权限,root表示要管理员权限,所以不切换账号没法用。

我感觉应该先备份一下,毕竟容易翻车,所以我cp了一下,然后用”find [当前路径] -name ‘ifcfg*’ “指令查看了一下文件,很完美。
大致步骤:

  1. 切换到etc/sysconfig/network-scripts目录
  2. 使用Vim编辑器修改网卡文件
  3. 重启网络服务并测试联通性

4.1.4配置Yum软件仓库

大致步骤:

  1. 进入etc/yum.repo.d/(该目录存放着Yum软件仓库的配置文件)
  2. 用Vim编辑器创建配置文件
  3. 按配置参数的路径挂载光盘,并把光盘挂载信息写入到/etc/fstab文件中
  4. 使用”yum install http -y“命令检查Yum软件仓库是否已经可用。

4.2编写Shell脚本

Shell脚本命令的工作方式由两种:交互式和批处理

  • 交互式(Interactive):用户每输入一条命令就立即执行。
  • 批处理(Batch):由用户事先编写好一个完整的Shell脚本,Shell会一次性执行脚本中诸多命令。
    查看SHELL变量可以发现当前系统已经默认使用Bash作为命令行终端解释器了:
[root@linuxprobe network-scripts]# echo $SHELL
/bin/bash
4.2.1编写简单的脚本
[root@linuxprobe ~]# vim example.sh
#!/bin/bash
#For Example BY linuxprobe.com
pwd
ls -al

Shell脚本文件的名称可以任意,但是最好加.sh后缀以表示脚本文件。
上述文件内容:
第一行:脚本声明(#!)表示用那种Shell解释器执行该脚本
第二行:(#)注释信息
以下:可执行语句

#脚本执行
bash example.sh

除上面执行方式,可以用输入完整路径方式来执行,但是默认会权限不足而报错

./example.sh
#这里可以结合前面的输出重定向将Shell执行结果输出到文件././example.sh &> log.log

4.2.2接收用户的参数

$0:当前Shell脚本程序名称
$#:总共有几个参数
$*:所有位置的参数值
$?:显示上一次命令的执行返回值
$1,$2,$3:对应第N个位置的参数值

[root@linuxprobe ~]# cat bbbb.sh 
echo "'This is a $0'"
echo "'has $# parameter'"
echo "'the last value is $?'"
echo "'$*'"
[root@linuxprobe ~]# bash bbbb.sh 
'This is a bbbb.sh'
'has 0 parameter'
'the last value is 0'
''

4.2.3判断用户的参数

Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回其他随机数值。条件测试语法的执行格式如下,体哦阿健表达式两边均应有一个空格。
在这里插入图片描述
按测试对象划分有4种:

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

使用条件判断文件是否存在或权限是否满足等情况
在这里插入图片描述

##判单是否为目录,并输出上一次命令执行的返回值
[root@linuxprobe ~]# [ -d /etc/fstab ]
[root@linuxprobe ~]# echo $?
1

逻辑测试语句
&&

与运算&&,表示当前命令执行成功后才会执行它后面的命令

[root@linuxprobe ~]# [ -d /etc ] && echo 'ggggg'
ggggg
[root@linuxprobe ~]# [ -d /etc/fstab ] && ech0 'ggggg'
[root@linuxprobe ~]# 

||

或运算||,当前命令执行失败后才会执行它后面的命令

## 看清楚有空格欸
[root@linuxprobe ~]# [ $USER=root ]|| echo 'gggg'
[root@linuxprobe ~]# [ $USER=linuxp ]|| echo 'gggg'
[root@linuxprobe ~]# [ $USER=linuxp ]|| echo "gggg"
[root@linuxprobe ~]# [ $USER = linuxp ]|| echo "gggg"
gggg

!

非运算!,表示把条件测试中的判断结果取相反值

[root@linuxprobe ~]# [ ! $USER = linuxp ]|| echo "gggg"
[root@linuxprobe ~]# [ $USER = linuxp ]|| echo "gggg"
gggg

**

留个坑,当前登录的用户和环境变量的关系搞不清楚

**

[root@linuxprobe ~]# [ ! $USER = root ] && echo "user" || echo "root"
整数测试语句

由于等于大于小于和赋值重定向等命令符冲突,故而转移符要换一下
在这里插入图片描述

[linuxprobe@linuxprobe root]$ [ 10 -eq 10 ]
[linuxprobe@linuxprobe root]$ echo $?
0
[linuxprobe@linuxprobe root]$ [ 10 -le 10 ]
[linuxprobe@linuxprobe root]$ echo $?
0
[linuxprobe@linuxprobe root]$ [ 10 -lt 10 ]
[linuxprobe@linuxprobe root]$ echo $?
1

[linuxprobe@linuxprobe root]$ free -m
             total       used       free     shared    buffers     cached
Mem:          1987       1773        214         10          0        976
-/+ buffers/cache:        796       1191
Swap:         2047          0       2047
[linuxprobe@linuxprobe root]$ free -m | grep Mem
Mem:          1987       1774        213         10          0        976
[linuxprobe@linuxprobe root]$ free -m | grep Mem | awk '{print $4}'
212
[linuxprobe@linuxprobe root]$ FreeMem=`free -m | grep Mem | awk '{print $4}'`
[linuxprobe@linuxprobe root]$ echo $FreeMem 
212

## 这里使用了反引号(``):把其中的命令执行后返回结果
## $$ && 这两个符号太像了
[linuxprobe@linuxprobe root]$ [ $FreeMem -lt 1024 ] $$ echo "poor guy"
bash: [: missing `]'
[linuxprobe@linuxprobe root]$ [ $FreeMem -lt 1024 ] && echo "poor guy"
poor guy

字符串测试语句

用于判断字符串是否为控制,或者两个字符串是否相同,常用来判断某个变量是否未被定义(即内容为空值)

在这里插入图片描述

[linuxprobe@linuxprobe root]$ [ -z $String ]
[linuxprobe@linuxprobe root]$ echo $?
0

4.3 流程控制语句

4.3.1if条件测试语句

分为:单分支结构、双分支结构、多分支结构
单分支由:if,then,fi组成
在这里插入图片描述

[root@linuxprobe ~]# vim mkcdrom.sh
#!/bin/bash
DIR="/media/cdrom"
if [ ! -e $DIR ]
then
mkdir -p $DIR
fi

双分支由if,then,else,fi组成
在这里插入图片描述

##-c尝试次数,-i每个数据包发送间隔,-W等待超时时间
[root@linuxprobe ~]# cat bbbb.sh 
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
## 这里没有加fi,就报错了
[root@linuxprobe ~]# bash bbbb.sh 
bbbb.sh: line 8: syntax error: unexpected end of file
[root@linuxprobe ~]# vi bbbb.sh 
[root@linuxprobe ~]# bash bbbb.sh 
Host  is Off-line
[root@linuxprobe ~]# bash bbbb.sh 192.168.10.10
Host 192.168.10.10 is On-line
[root@linuxprobe ~]# bash bbbb.sh 192.168.10.11
Host 192.168.10.11 is Off-line
[root@linuxprobe ~]# 

多分枝结构由if、then、else、elif、fi组成
在这里插入图片描述

## read是用来读取用户输入信息的命令,能够把接收到的用户输入信息赋值给后面的指定变量,-p参数用户向用户显示一定的提示信息
[root@linuxprobe ~]# cat bbbb.sh 
read -p "Enter you score(0-100):" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ];then
echo "good"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ];then
echo "pass"
else
echo "explore"
fi
[root@linuxprobe ~]# bash bbbb.sh 
Enter you score(0-100):0
explore
[root@linuxprobe ~]# bash bbbb.sh 
Enter you score(0-100):1000
explore
[root@linuxprobe ~]# bash bbbb.sh 
Enter you score(0-100):77
pass

4.3.2for条件循环语句

for循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理。
在这里插入图片描述
/dev/null是一个被称作Linux黑洞的文件,把输出信息重定向到这个文件等同于删除数据,可以让用户的屏幕窗口保持简洁。

## 这里留个坑
[root@linuxprobe ~]# vim Example.sh
#!/bin/bash
read -p "Enter The Users Password : " PASSWD
for UNAME in `cat users.txt`
do
id $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "Already exists"
else
useradd $UNAME &> /dev/null
echo "$PASSWD" | passwd --stdin $UNAME &> /dev/null
if [ $? -eq 0 ]
then
echo "$UNAME , Create success"
else
echo "$UNAME , Create failure"
fi
fi
done
## 脚本中出现的$(命令)是一种完全类似于转移字符`命令`的Shell操作符,效果同样是执行括号或者双引号括起来的字符串的命令。
[root@linuxprobe ~]# cat bbbb.sh 
HLIST=$(cat ~/ipadds.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ];then
echo "Host $IP is On-line"
else
echo "Host $IP id Off-line"
fi
done
[root@linuxprobe ~]# 
[root@linuxprobe ~]# touch ipadds.txt
[root@linuxprobe ~]# vi ipadds.txt 
[root@linuxprobe ~]# bash bbbb.sh 
Host 192.168.10.10 is On-line
Host 192.168.10.11 id Off-line
Host 192.168.10.12 id Off-line

**

坑:Linux中cat读取文件内容后在循环中是按什么规则分的

**

4.3.3 while 条件循环语句

在这里插入图片描述

[root@linuxprobe ~]# cat bbbb.sh 
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "guess price?"
while true
do
read -p "input:" INT
let TIMES++
if [ $INT -eq $PRICE ];then
echo "yes,it is $PRICE"
echo "$TIMES times"
exit 0
elif [ $INT -gt $PRICE ];then
echo "too high"
else
echo "too low"
fi
done
[root@linuxprobe ~]# bash bbbb.sh 
guess price?
input:500
too high
input:250
too low
input:300
``
too low
input:349
yes,it is 349
14 times

## 输入字符串就翻车了
guess price?
input:asd
bbbb.sh: line 8: [: asd: integer expression expected
bbbb.sh: line 12: [: asd: integer expression expected
too low
input:dwa
bbbb.sh: line 8: [: dwa: integer expression expected
bbbb.sh: line 12: [: dwa: integer expression expected
too low

[root@linuxprobe ~]# 

4.3.4case条件测试语句

在这里插入图片描述

[root@linuxprobe ~]# bash bbbb.sh 
inputa
abc
[root@linuxprobe ~]# cat bbbb.sh 
read -p "input" KEY
case "$KEY" in
[a-z]|[A-Z])
echo "abc"
;;
[0-9])
acho "123"
;;
*)
echo "error"
esac

4.4计划任务服务程序

计划任务分为一次性计划任务与长期性计划任务

  • 一次性:如今天2点关机
  • 长期:如每天2点输出”你好“

使用at命令来设置一次性计划任务时,默认采用交互式方法。

[root@linuxprobe ~]# at 23:30
at> systemctl restart httpd
at>  CTRL + D 来退出编写
job 1 at Wed Mar 10 23:30:00 2021
[root@linuxprobe ~]# at -l
1	Wed Mar 10 23:30:00 2021 a root
[root@linuxprobe ~]# 

可以把前面学习的管道符(任意门)放到两条命令之间,让at命令接收前面echo命令的输出信息,以达到通过非交互式的方式创建几哈一次性任务的目的。

[root@linuxprobe ~]# at -l
1	Wed Mar 10 23:30:00 2021 a root
[root@linuxprobe ~]# echo "systemctl restart httpd" | at 23:30
job 2 at Wed Mar 10 23:30:00 2021
[root@linuxprobe ~]# at -l
1	Wed Mar 10 23:30:00 2021 a root
2	Wed Mar 10 23:30:00 2021 a root
[root@linuxprobe ~]# 

删除atrm

[root@linuxprobe ~]# at -l
1	Wed Mar 10 23:30:00 2021 a root
2	Wed Mar 10 23:30:00 2021 a root
[root@linuxprobe ~]# atrm 1
[root@linuxprobe ~]# at -l
2	Wed Mar 10 23:30:00 2021 a root
[root@linuxprobe ~]# atrm 2
[root@linuxprobe ~]# at -l
[root@linuxprobe ~]# 

如果要周期性的执行,那Linux中默认启用的crond服务很合适。

## 创建编辑计划任务
crontab -e
## 查看
crontab -l
## 删除
crontab -r
##编辑他人任务
crontab -u

”分、时、日、月、星期、命令“,如果没有设置,用星号(*)占位
在这里插入图片描述

[root@linuxprobe ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@linuxprobe ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot

逗号(,)表示多个时间段,减号(-)表示一段连续的时间周期,除号(/)表示执行任务的时间间隔

注:任务参数中,所有命令一定要用绝对路径的方式来写,如果不知道,用whereis命令查询

[root@linuxprobe ~]# whereis rm
rm: /usr/bin/rm /usr/share/man/man1/rm.1.gz /usr/share/man/man1p/rm.1p.gz
[root@linuxprobe ~]# crontab -e
crontab: installing new crontab
[root@linuxprobe ~]# crontab -l
25 3 * * 1,3,5 /usr/bin/tar -czvf backup.tar.gz /home/wwwroot
0 1 * * 1-5 /usr/bin/rm -rf /tmp/*

注意事项:

  • crond服务的配置参数中,可以像Shell脚本那样以#开头写上注释信息
  • 计划任务中”分“字段必须有数值,绝不能为空或者是*,而”日“和”星期“不能同时使用,否则会冲突。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值