1、文本编辑器
命令模式(vi、vim):控制光标移动,可对文本进行复制、粘贴、删除和查找等工作
输入模式(a、i、o):正常的文本录入
末行模式(:w、:q):保存或退出文档,以及设置编辑环境
1、常用命令
序号 | 用法 | 注解 |
---|---|---|
1 | [N]dd | 删除N行 |
2 | dG | 删除光标之后的所有行 |
3 | [N]yy | 复制N行 |
4 | u | 撤销上一步操作 |
5 | p | 将复制的内容进行粘贴 |
6 | ^、0、home | 将光标移至行首 |
7 | $、end | 将光标移至行末 |
8 | :N | 跳到N行 |
9 | :s/one/two | 将当前光标所在行的第一个 one 替换成 two |
10 | :%s/one/two/g | 将全文中的所有 one 替换成 two |
11 | :wq | 保存退出 |
12 | :q! | 不保存强制退出 |
2、配置主机名称
[root01@VM-0-15-centos ~]$ vi /etc/hostname
3、配置网卡信息
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33
设备类型: TYPE=Ethernet
地址分配模式: BOOTPROTO=static
网卡名称: NAME=ens33
是否启动: ONBOOT=yes
IP 地址: IPADDR=192.168.10.10
子网掩码: NETMASK=255.255.255.0
网关地址: GATEWAY=192.168.10.1
DNS 地址: DNS1=192.168.10.1
[root@localhost ~]# systemctl restart network #重启网卡
2、编写shell脚本
[root@localhost ~]# echo $SHELL #注意: 这个SHELL是大写的,区分大小写
/bin/bash
1、编写shell脚本
编写shell脚本,脚本内容是以#!/bin/bash开头。文件名是以.sh结尾,用sh来执行
[root@localhost study]# vi example.sh
#!/bin/bash #写到example.sh 文件中
pwd
[root@localhost study]# sh example.sh #执行脚本example.sh
/study #显示执行结果
2、接收用户参数
[root@linuxprobe ~]# vim example.sh
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*。"
echo "第 1 个参数为$1,第 5 个为$5。"
[root@linuxprobe ~]# sh example.sh one two three four five six
当前脚本名称为 example.sh
总共有6个参数,分别是 one two three four five six。 第1个参数为 one,第5个为five
3、判断用户参数
SHELL脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字 0,否则便返回其他随机数值。切记,条件表达式两边均应有一个空格
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行
[root@localhost study]# [ -d /study/d ]
[root@localhost study]# echo $?
0
[root@localhost study]# [ -f /study/d ]
[root@localhost study]# echo $?
1
在Shell终端中逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令
#前面成立,后面输出
[root01@VM-0-15-centos ~]$ [ $USER = root01 ] && echo "exit"
exit
[root01@VM-0-15-centos ~]$ [ $USER != root01 ] && echo "exit"
除了逻辑“与”外,还有逻辑“或”,它在Linux系统中的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令
# 其实就是双重否定为肯定
# 前面不成立,后面就会输出
# 用户root01 不等于 root,前面成立,后面不输出
[root01@VM-0-15-centos ~]$ [ $USER != root ] || echo "exit"
[root01@VM-0-15-centos ~]$
## 用户root01 不等于 root01,前面不成立,后面输出
[root01@VM-0-15-centos ~]$ [ $USER != root01 ] || echo "exit"
exit
[root@linuxprobe ~]# [ ! $USER = root ] && echo "user" || echo "root"
root
[root@linuxprobe ~]# [ ! $USER = root ] && echo "user" #这快不成立,所以会输出root
4、整数比较运算符
-eq 是否等于
-ne 是否不等于
-gt 是否大于
-lt 是否小于
-le 是否等于或小于
-ge 是否大于或等于
[root@localhost ~]# [ 10 -gt 10 ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# [ 10 -eq 10 ]
[root@localhost ~]# echo $?
0
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 1819 185 1495 9 138 1486
Swap: 2047 0 2047
[root@localhost ~]# FreeMem=`free -m | grep Mem: | awk '{print $4}'`
[root@localhost ~]# echo $FreeMem
1494
[root@localhost ~]# [ $FreeMem -gt 1024 ] && echo "大于"
大于
5、字符串比较运算符
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空
[root@localhost ~]# [ c = d ]
[root@localhost ~]# echo $?
1
[root@localhost ~]# echo $LANG
zh_CN.UTF-8
[root@localhost ~]# [ $LANG != "en.US" ] && echo "不匹配"
不匹配
3、流程控制语句
1、if条件测试语句
if 条件语句的单分支结构由 if、then、fi 关键词组成,而且只在条件成立后才执行预设的
命令,相当于口语的“如果……那么……”。单分支的 if 语句属于最简单的一种条件判断结构
#示例内容
[root@VM-0-15-centos study]# more get_user.sh
#!/bin/bash
# testing multiple commands in the then section
#
testuser=root01
#
if grep $testuser /etc/passwd
then
echo "This is my first command"
echo "This is my second command"
echo "I can even put in other commands besides echo:"
ls -a /home/$testuser/.b*
fi
#示例执行结果
[root@VM-0-15-centos study]# sh get_user.sh
root01:x:1000:1000::/home/root01:/bin/bash
This is my first command
This is my second command
I can even put in other commands besides echo:
/home/root01/.bash_history /home/root01/.bash_logout /home/root01/.bash_profile /home/root01/.bashrc
#从键盘输入一个数做比较
[root@linuxprobe ~]# vim chkscore.sh
#!/bin/bash
read -p "请输入0~100的数:" GRADE
if [ $GRADE -ge 85 ] && [ $GRADE -le 100 ] ; then
echo "$GRADE 优秀"
elif [ $GRADE -ge 70 ] && [ $GRADE -le 84 ] ; then
echo "$GRADE 良好"
else
echo "$GRADE 不及格"
fi
[root@VM-0-15-centos study]# sh chkscore.sh
请输入0~100的数:12
$不及格
2、for循环语句,进行循环操作
#格式
for变量 in 列表; do
循环体
done
#1~10求和
[root@VM-0-15-centos study]# more sum.sh
#!/bin/bash
for i in {1..10} ; do
let SUM+=$i
done
echo "$SUM"
[root@VM-0-15-centos study]# sh sum.sh
55
#格式
for ((变量=初始值 ; 变量范围 ; 变量变化方式)); do
循环体
done
#1~100求和,注意:多个()
[root@VM-0-15-centos study]# more sum.sh
#!/bin/bash
for ((i = 1 ; i < 100 ; i++)) ; do
let SUM+=$i
done
echo "$SUM"
[root@VM-0-15-centos study]# sh sum.sh
4950
3、while条件循环语句
适用于循环次数未知的场景,要有退出条件,否则就成为死循环。
#使用while循环1-100求和
[root@VM-0-15-centos study]# more example_while.sh
#!/bin/bash
#i=1
#sum=0
i=1
sum=0
echo "i为:$i"
echo "sum初始化为:$sum"
while [ $i -le 100 ] ; do
let sum=$sum+$i
let i++
done
echo "$sum"
[root@VM-0-15-centos study]# sh example_while.sh
i为:1
sum初始化为:0
5050
注:1、变量定义的时候不要有空格,直接i=1
2、变量相加的时候不要有空格,要不然会有以下报错,let sum=$sum+$i
syntax error: operand expected (error token is "=")
#随机生成一个数去猜,看几次能猜中
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
TIMES=0
echo "商品实际价格为 0-999 之间,猜猜看是多少?"
while true
do
read -p "请输入您猜测的价格数目:" INT
let TIMES++
if [ $INT -eq $PRICE ] ; then
echo "恭喜您答对了,实际价格是 $PRICE"
echo "您总共猜测了 $TIMES 次"
exit 0
elif [ $INT -gt $PRICE ] ; then
echo "太高了!"
else
echo "太低了!"
fi
done
4、case条件测试语句
case 变量 in
常量1)语句;;
常量2)语句;;
*)默认语句;;
esac
#输入单个字母或者数字进行判断; 注:字母只能是单个,多个就无法判断正确
[root@VM-0-15-centos study]# more case_example.sh
#!/bin/bash
read -p "请输入一个字符" answer
echo "$answer"
case "$answer" in
[a-z])
echo "您输入的是字母" ;;
[0-9])
echo "您输入的数字" ;;
*)
echo "您输入的是空格、功能键或其他控制字符。"
esac
[root@VM-0-15-centos study]# sh case_example.sh
请输入一个字符w
w
您输入的是字母
4、计划任务服务程序
计划任务在Linux 中一般使用 Crontab,通过 crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 Shell 脚本
crontab命令选项
# crontab -u
-u指定一个用户
-l列出某个用户的任务计划
-r删除某个用户的任务
-e编辑某个用户的任务
分钟 小时 日 月 星期 命令
特殊符号的含义
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜 线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
5 * * * * ls 指定每小时的第5分钟执行一次ls命令
30 5 * * * ls 指定每天的 5:30 执行ls命令
30 7 8 * * ls 指定每月8号的7:30分执行ls命令
30 5 8 6 * ls 指定每年的6月8日5:30执行ls命令
30 6 * * 0 ls 指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]
30 3 10,20 * * ls 每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]
25 8-11 * * * ls 每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段] */15 * * * * ls 每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]
30 6 */10 * * ls 每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls命令 ]
50 7 * * * root run-parts /etc/cron.daily 每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件
4.1 crontab文件存
[root@localhost cron]# pwd
/var/spool/cron
4.2 crontab的服务
crontab的服务名称 crond