1 核心命令回顾
1.1 筛选信息
shell 快捷键、grep、sort
shell快捷键
快捷键符号
命令执行:
!! 执行上一条命令
!num 执行历史命令中的第num行命令
Ctrl 关键字 执行内容匹配的命令
命令行切换
Ctrl + A 光标迅速回到行首
Ctrl + E 光标迅速回到行尾
Ctrl + K 删除光标到行尾内容
Ctrl + U 删除光标到行首内容
Ctrl + Y 粘贴删除的内容
Ctrl + C 临时终止命令行命令
Esc + B 移动到当前单词的开头
Esc + F 移动到当前单词的结尾
grep命令
负责从数据源中检索对应的字符串,进行过滤
grep [OPTIONS] 'keys' filename
OPTIONS:
-i: 不区分大小写
-v: 查找不包含指定内容的行,反向选择
-w: 按单词搜索
-o: 打印匹配关键字
-c: 统计匹配到的次数
-n: 显示行号
-r: 逐层遍历目录查找
-A: 显示匹配行及后面多少行
-B: 显示匹配行及前面多少行
-C: 显示匹配行前后多少行
-l:只列出匹配的文件名
-L:列出不匹配的文件名
-e: 使用正则匹配
-E:使用扩展正则匹配
^key:以关键字开头
key$:以关键字结尾
^$:匹配空行
--color=auto :可以将找到的关键词部分加上颜色的显示
grep 高亮显示
centos7中已经为大家设置了,存放在/etc/profile.d/colorgrep.sh文件中,如若大家使用的系统中没有设置颜色输出,可以使用以下方法来自行设置
临时设置:
# alias grep='grep --color=auto' //只针对当前终端和当前用户生效
永久设置:
1)全局(针对所有用户生效)
vim /etc/bashrc
alias grep='grep --color=auto'
source /etc/bashrc
2)局部(针对具体的某个用户)
vim ~/.bashrc
alias grep='grep --color=auto'
source ~/.bashrc
常用命令选项必知必会 示例:
# grep -i root filename 忽略大小写匹配包含root的行
# grep -w ftp filename 精确匹配ftp单词
# grep -wo ftp filename 打印匹配到的关键字ftp
# grep -n root filename 打印匹配到root关键字的行号
# grep -ni root filename 忽略大小写匹配统计包含关键字root的行
# grep -nic root filename 忽略大小写匹配统计包含关键字root的行数
# grep -i ^root filename 忽略大小写匹配以root开头的行
# grep bash$ filename 匹配以bash结尾的行
# grep -n ^$ filename 匹配空行并打印行号
# grep ^# filename 匹配以#号开头的行
# grep -v ^# filename 匹配不以#号开头的行
# grep -A 5 mail filename 匹配包含mail关键字及其后5行
# grep -B 5 mail filename 匹配包含mail关键字及其前5行
# grep -C 5 mail filename 匹配包含mail关键字及其前后5行
sort命令
信息排序
语法:
sort [options] file
将文件的每一行作为一个单位,从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
options:
-u :去除重复行
-r :降序排列,默认是升序
-o : 将排序结果输出到文件中 类似 重定向符号>
-n :以数字排序,默认是按字符排序
-t :分隔符
-k :第N列
-b :忽略前导空格。
-R :随机排序,每次运行的结果均不同。
文件内容
[root@localhost ~]# cat num.txt
9
8
6
8
4
7
2
1
内容升序
[root@localhost ~]# sort -n num.txt
1
2
4
6
7
8
8
9
内容降序
[root@localhost ~]# sort -r num.txt
9
9
8
7
6
4
2
1
其他实践
sort -nu num.txt 升序去重
sort -ru num.txt 降序去重
sort -nru num.txt 先升序后降序再去重
sort -R num.txt 随机排序
sort -nu num.txt -o /tmp/a.txt 升序去重后输出到一个文件
1.2 处理信息
cut、tr、uniq
cut命令
数据截取
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的范围之内,该字符将被写出;否则,该字符将被排除
-s, --only-delimited 不打印没有包含分界符的行
--output-delimiter=字符串 使用指定的字符串作为输出分界符,默认采用输入的分界符
--help 显示此帮助信息并退出
--version 显示版本信息并退出
# cut -d: -f1 1.txt 以:冒号分割,截取第1列内容
# cut -d: -f1,6,7 1.txt 以:冒号分割,截取第1,6,7列内容
# cut -c4 1.txt 截取文件中每行第4个字符
# cut -c1-4 1.txt 截取文件中每行的1-4个字符
# cut -c5- 1.txt 从第5个字符开始截取后面所有字符
tr命令
字符转换、替换、删除
用法:tr [选项]... SET1 [SET2]
从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。
-c, -C, --complement 反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换
-d, --delete 删除匹配SET1 的内容,并不作替换
-s, --squeeze-repeats 如果匹配于SET1 的字符在输入序列中存在连续的
重复,在替换时会被统一缩为一个字符的长度
-t, --truncate-set1 先将SET1 的长度截为和SET2 相等
--help 显示此帮助信息并退出
--version 显示版本信息并退出
用法1:把commands命令输出做为tr输入进行处理
commands | tr 'string1' 'string2'
用法2:把文件中的内容输入给tr进行处理
tr 'string1' 'string2' < filename
用法3:把文件中的内容输入给tr进行处理,需要使用到选项
tr options 'string1' < filename
示例1:通过tr把反复出现的内容进行压缩,压缩后再处理。
[root@localhost ~]# ifconfig eth0 | grep -w inet
inet 10.0.0.12 netmask 255.255.255.0 broadcast 10.0.0.255
[root@localhost ~]# ifconfig eth0 | grep -w inet | tr -s " "
inet 10.0.0.12 netmask 255.255.255.0 broadcast 10.0.0.255
[root@localhost ~]# ifconfig eth0 | grep -w inet | tr -s " " | cut -d " " -f 3
10.0.0.12
示例2: 文件的演示
[root@localhost ~]# head -n 5 /etc/passwd > test1.txt
[root@localhost ~]# tr '[0-9]' '@' < test1.txt
root:x:@:@:root:/root:/bin/bash
bin:x:@:@:bin:/bin:/sbin/nologin
daemon:x:@:@:daemon:/sbin:/sbin/nologin
adm:x:@:@:adm:/var/adm:/sbin/nologin
lp:x:@:@:lp:/var/spool/lpd:/sbin/nologin
[root@localhost ~]# tr '[a-z]' '[A-Z]' < test1.txt
ROOT:X:0:0:ROOT:/ROOT:/BIN/BASH
BIN:X:1:1:BIN:/BIN:/SBIN/NOLOGIN
DAEMON:X:2:2:DAEMON:/SBIN:/SBIN/NOLOGIN
ADM:X:3:4:ADM:/VAR/ADM:/SBIN/NOLOGIN
LP:X:4:7:LP:/VAR/SPOOL/LPD:/SBIN/NOLOGIN
uniq命令
连续信息去重
-c, --count 统计重复行次数
-d, --repeated 只显示重复行
-i, --ignore-case 忽略大小写
-s, --skip-chars=N 忽略比较指定的字符
-u, --unique 仅显示出一次的行列
文件内容
[root@localhost ~]# cat uniq.txt
AA
aa
aa
bb
cc
cc
dd
去重演示
[root@localhost ~]# uniq uniq.txt
AA
aa
bb
cc
dd
其他演示
uniq -i uniq.txt 大小写不敏感去重
uniq -ic uniq.txt 大小写不敏感去重后计数
uniq -d uniq.txt 仅显示重复的内容
sort -n num.txt | uniq 结合sort排序后去重
1.3 组合信息
paste、xargs
paste命令
合并文件行内容输出到屏幕,不会改动源文件
-d, --delimiters=列表 改用指定列表里的字符替代制表分隔符
-s, --serial 不使用平行的行目输出模式,而是每个文件占用一行
--help 显示此帮助信息并退出
--version 显示版本信息并退出
文件内容
[root@localhost ~]# cat a.txt
hello
[root@localhost ~]# cat b.txt
world
888
999
内容合并
[root@localhost ~]# paste a.txt b.txt
hello world
888
999
[root@localhost ~]# paste b.txt a.txt
world hello
888
999
自定义分隔符后合并内容
[root@localhost ~]# paste -d'@' b.txt a.txt
world@hello
888@
999@
将一个文件所有内容一行输出
[root@localhost ~]# paste -s b.txt
world 888 999
[root@localhost ~]# paste -d'@' -s b.txt
world@888@999
xargs命令
命令结果传递
作用:
xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据。
xargs 一般是和管道一起使用。
命令格式:
somecommand |xargs -item command
参数:
-a file 从文件中读入作为sdtin
-E flag flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
-p 当每次执行一个argument的时候询问一次用户。
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
-t 表示先打印命令,然后再执行。
-i 或者是-I,将xargs接收的每项名称,逐行赋值给 {},可以用 {} 代替。
-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
从文件中读取内容
[root@localhost ~]# xargs -a num.txt
9 8 6 8 4 7 2 1
从文件中读取内容时,指定内容结束符号
[root@localhost ~]# xargs -a num.txt -E 4
9 8 6 8
从文件中读取内容时,询问用户是否显示,y显示,其他不显示
[root@localhost ~]# xargs -a num.txt -p
echo 9 8 6 8 4 7 2 1 ?...y
9 8 6 8 4 7 2 1
[root@localhost ~]# xargs -a num.txt -p
echo 9 8 6 8 4 7 2 1 ?...n
从文件中读取内容时,指定每行显示几个内容
[root@localhost ~]# xargs -a num.txt -n4
9 8 6 8
4 7 2 1
从文件中读取内容时,指定每行显示几个内容,没显示一行询问一下用户
[root@localhost ~]# xargs -a num.txt -n4 -p
echo 9 8 6 8 ?...y
9 8 6 8
echo 4 7 2 1 ?...y
4 7 2 1
默认xargs以空格为分隔符,可以通过-d来自定义分隔符
[root@localhost ~]# echo "ab cd ef g" | xargs
ab cd ef g
[root@localhost ~]# echo "nameXnameXnameXname" | xargs -dX
name name name name
[root@localhost ~]# echo "nameXnameXnameXname" | xargs
nameXnameXnameXname
-I 临时存储内容给一个对象,然后进行后续处理
[root@localhost ~]# xargs -a num.txt -n1 -I {} echo {}--bak
9--bak
8--bak
6--bak
8--bak
4--bak
7--bak
2--bak
1--bak
-I的综合运用,转移文件并改名
[root@localhost ~]# ls *.txt
a.txt b.txt num.txt test1.txt uniq.txt
[root@localhost ~]# ls *.txt | xargs -n1 -I {} cp {} /tmp/{}-bak
[root@localhost ~]# ls /tmp/*-bak
/tmp/a.txt-bak /tmp/num.txt-bak /tmp/uniq.txt-bak
/tmp/b.txt-bak /tmp/test1.txt-bak
2 编程简介
2.1 编程语言解读
基础知识、编程语言
基础知识
程序
外在关系:
业务数据:用户访问业务时候,产生的信息内容
数据结构:静态的描述了数据元素之间的关系
算法:解决各种实际问题的方法和思路
数据结构 + 算法 = 程序
内在关系:
算法其实就是数据的表示和处理,而数据的处理受到数据的各种存储形式的约束,所以算法的效率和样式受到数据结构的严重约束。
数据结构存储下来的数据为为算法服务的,而算法存在的意义就是为了数据结构中的内容而存在的。
所以说:数据结构和算法,是你中有我,我中有你的合二为一的关系
编程语言
编程
所谓的编程,就是将我们的功能思路用代码的方式实现出来。一般情况下,这些实现的思路主要有两种方式:
面向过程编程
将任务功能拆分成多个子部分,然后按照顺序依次执行下去。
- 问题规模小,可以步骤化,按部就班处理
比较符合我们自己做一件事情的思路。
面向对象编程
将任务功能拆分成多个子部分,然后按照顺序依次找不同的人执行下去。
- 问题规模大,复杂系统
比较符合我们的领导指挥一个部门的人做事情的思路。
编程语言
所谓编程语言,指的是以哪种风格代码方式把程序编写出来。每一种编程风格就是一系列的编程语言。
参考资料:
https://www.tiobe.com/tiobe-index/
https://hellogithub.com/report/tiobe/
2.2 编程语言逻辑
语言分类、编程逻辑
语言分类
低级编程语言:
机器:
- 二进制的0和1的序列,称为机器指令。
- 一般人看不懂
汇编:
- 用一些助记符号替代机器指令,称为汇编语言。
- 一般人看不懂,但是能够有感觉
高级编程语言:
编译:
- 借助于专属编译器将一些高级语言编译成机器代码文件,然后再交给程序去执行。
- 如:C,C++等
解释:
- 将高级语言的代码逐行加载到解释器环境,逐行解释为机器代码,然后再交给程序去执行。
- 如:shell,python,php,JavaScript等
编程逻辑
编程语言的目的是通过风格化的编程思路将代码写出来后,实现项目功能的。为了实现功能,我们通过在代码层面通过一些代码逻辑来实现:
顺序执行 - 程序按从上到下顺序执行
选择执行 - 程序执行过程中,根据条件选择不同的顺序执行
循环执行 - 程序执行过程中,根据条件重复执行代码
3 shell基础
3.1 shell简介
运维、shell语言
运维
运维是什么?
所谓的运维,其实就是公司的内部项目当中的一个技术岗位而已,它主要做的是项目的维护性工作。它所涉及的内容范围非常多。
以xx项目为例:
规划:我们需要多少资源来支持项目的运行
管理:项目运行过程中的所有内容都管理起来
流程规范:所有操作都形成制度,提高工作效率
平台:大幅度提高工作效率
监控:实时查看项目运行状态指标
告警:状态指标异常,告知工作人员处理
安全:网站运营安全措施
优化:保证用户访问网站体验很好
考核:权责分配,保证利益
自动化运维:就是将图里面所有的工作都使用自动化的方式来实现。
实现自动化的方式很多,常见的方式:工具和脚本。
工作中常见的脚本有哪些呢?
shell脚本 和 其他开发语言脚本
shell语言
shell定义
在计算机科学中,Shell就是一个命令解释器。
shell是位于操作系统和应用程序之间,是他们二者最主要的接口,shell负责把应用程序的输入命令信息解释给操作系统,将操作系统指令处理后的结果解释给应用程序。
一句话,shell就是在操作系统和应用程序之间的一个命令翻译工具。
3.2 shell实践
shell分类、shell实践
shell分类
简介
在不同的操作系统上,shell的表现样式是不一样的,按照我的角度,它主要分为两类
图形界面shell
图形界面shell就是我们常说的桌面
命令行式shell
windows系统:
cmd.exe 命令提示字符
linux系统:
sh / csh / ksh / bash(默认) / ...
查看系统的shell
查看当前系统的shell类型
[root@localhost ~]# echo $SHELL
/bin/bash
查看当前系统环境支持的shell
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
更改默认的shell
chsh <用户名> -s <新shell>
[root@localhost ~]# su - python
[python@localhost ~]$ exit
登出
[root@localhost ~]# chsh python -s /bin/sh
Changing shell for python.
Shell changed.
[root@localhost ~]# su - python
上一次登录:二 6月 7 20:11:13 CST 2022pts/0 上
-sh-4.2$ exit
登出
[root@localhost ~]# chsh python -s /bin/bash
Changing shell for python.
Shell changed.
[root@localhost ~]# su - python
上一次登录:二 6月 7 20:11:35 CST 2022pts/0 上
[python@localhost ~]$ echo $SHELL
/bin/bash
安装shell
yum list | grep zsh
yum install -y zsh
查看效果
[root@localhost ~]# cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/zsh
shell实践
命令行实践方式
描述:
手工敲击键盘,在shell的命令行输入命令,按Enter后,执行通过键盘输入的命令,然后shell返回并显示命令执行的结果.
重点:
逐行输入命令、逐行进行确认执行
直接找一个终端界面执行一些可执行的命令即可
[root@localhost ~]# whoami
root
[root@localhost ~]# pwd
/root
[root@localhost ~]# date +"%F %T"
2022-06-07 20:14:46
文件实现方式
描述:
就是说我们把手工执行的命令a,写到一个脚本文件b中,然后通过执行脚本b,达到执行命令a的效果.
重点:
按照文件内容的顺序执行。
找一个文件,将我们刚才执行成功的命令放到里面。
[root@localhost ~]# cat test
whoami
pwd
date +"%F %T"
[root@localhost ~]# /bin/bash test
root
/root
2022-06-07 20:16:20
3.3 shell脚本实践
脚本基础、脚本实践
脚本基础
shell脚本
当可执行的Linux命令或语句不在命令行状态下执行,而是通过一个文件执行时,我们称文件为shell脚本。
应用场景
重复化、复杂化的工作,通过把工作的命令写成脚本,以后仅仅需要执行脚本就能完成这些工作。
自动化分析处理
自动化备份
自动化批量部署安装
等等...
脚本创建
脚本创建工具:
创建脚本的常见编辑器是 vi/vim.
脚本命名
shell脚本的命名简单来说就是要有意义,方便我们通过脚本名,来知道这个文件是干什么用的。
脚本内容:
各种可以执行的命令
脚本注释
单行注释:
除了首行的#不是注释外,其他所有行内容,只要首个字符是#,那么就表示该行是注释
多行注释:
多行注释有两种方法::<<! ... ! 和 :<<字符 ... 字符
脚本实践
脚本示例1
脚本内容
[root@localhost ~]# cat get_netinfo.sh
#!/bin/bash
# 功能:获取当前主机的网卡设备信息
# 版本:V0.1
# 获取ip地址信息
ifconfig eth0 | grep -w inet | awk '{print $2}' | xargs echo "IP: "
# 获取掩码地址信息
ifconfig eth0 | grep -w inet | awk '{print $4}' | xargs echo "NetMask: "
# 获取广播地址信息
ifconfig eth0 | grep -w inet | awk '{print $6}' | xargs echo "Broadcast: "
# 获取MAC地址信息
ifconfig eth0 | grep ether | awk '{print $2}' |xargs echo "MAC Address: "
执行脚本
[root@localhost ~]# /bin/bash get_netinfo.sh
IP: 10.0.0.12
NetMask: 255.255.255.0
Broadcast: 10.0.0.255
MAC Address: 00:0c:29:23:23:8c
脚本注释
更改脚本内容
[root@localhost ~]# cat get_netinfo.sh
#!/bin/bash
:<<!
功能:获取当前主机的网卡设备信息
版本:V0.1
!
... ...
3.4 脚本执行
脚本执行、脚本调试
脚本执行
方法1:
bash /path/to/script-name 或 /bin/bash /path/to/script-name (强烈推荐使用)
方法2:
/path/to/script-name 或 ./script-name (当前路径下执行脚本)
方法3:
source script-name 或 . script-name (注意“.“点号)
方法1变种:
cat /path/to/script-name | bash
bash /path/to/script-name
脚本执行说明
1、脚本文件本身没有可执行权限或者脚本首行没有命令解释器时使用的方法,我们推荐用bash执行。
使用频率:☆☆☆☆☆
2、脚本文件具有可执行权限时使用。
使用频率:☆☆☆☆
3、使用source或者.点号,加载shell脚本文件内容,使shell脚本内容环境和当前用户环境一致。
使用频率:☆☆☆
使用场景:环境一致性
执行示例
方法1:
[root@localhost ~]# /bin/bash get_netinfo.sh
IP: 10.0.0.12
NetMask: 255.255.255.0
Broadcast: 10.0.0.255
MAC Address: 00:0c:29:23:23:8c
方法2:
[root@localhost ~]# ./get_netinfo.sh
bash: ./get_netinfo.sh: 权限不够
[root@localhost ~]# ll get_netinfo.sh
-rw-r--r-- 1 root root 521 6月 7 20:41 get_netinfo.sh
[root@localhost ~]# chmod +x get_netinfo.sh
[root@localhost ~]# ./get_netinfo.sh
IP: 10.0.0.12
NetMask: 255.255.255.0
Broadcast: 10.0.0.255
MAC Address: 00:0c:29:23:23:8c
方法3:
[root@localhost ~]# source get_netinfo.sh
IP: 10.0.0.12
NetMask: 255.255.255.0
Broadcast: 10.0.0.255
MAC Address: 00:0c:29:23:23:8c
[root@localhost ~]# chmod -x get_netinfo.sh
[root@localhost ~]# ll get_netinfo.sh
-rw-r--r-- 1 root root 521 6月 7 20:41 get_netinfo.sh
[root@localhost ~]# source get_netinfo.sh
IP: 10.0.0.12
NetMask: 255.255.255.0
Broadcast: 10.0.0.255
MAC Address: 00:0c:29:23:23:8c
方法1变种:
[root@localhost ~]# cat get_netinfo.sh | bash
IP: 10.0.0.12
NetMask: 255.255.255.0
Broadcast: 10.0.0.255
MAC Address: 00:0c:29:23:23:8c
[root@localhost ~]# bash < get_netinfo.sh
IP: 10.0.0.12
NetMask: 255.255.255.0
Broadcast: 10.0.0.255
MAC Address: 00:0c:29:23:23:8c
3.5 脚本调试
脚本调试、简单实践
脚本调试
需求
我们在编写脚本的时候,往往会受到各种因素的限制,导致脚本功能非常大或者内容有误,如果直接执行脚本的时候,因为脚本内容有误,导致脚本执行失败。
所以我们需要在脚本执行的时候,保证脚本没问题,我们可以借助于多种脚本调试方式来验证脚本。
调试方式
-n 检查脚本中的语法错误
-v 先显示脚本所有内容,然后执行脚本,结果输出,如果执行遇到错误,将错误输出。
-x 将执行的每一条命令和执行结果都打印出来
简单实践
准备工作
准备备份文件
cp get_netinfo.sh get_netinfo-error.sh
设置错误文件
[root@localhost ~]# cat get_netinfo-error.sh
...
# 将最后一行末尾的"取消
ifconfig eth0 | grep ether | awk '{print $2}' |xargs echo "MAC Address: "
错误脚本执行效果
[root@localhost ~]# /bin/bash get_netinfo-error.sh
IP: 10.0.0.12
NetMask: 255.255.255.0
Broadcast: 10.0.0.255
get_netinfo-error.sh:行19: 寻找匹配的 `"' 是遇到了未预期的文件结束符
get_netinfo-error.sh:行20: 语法错误: 未预期的文件结尾
检查语法实践
[root@localhost ~]# /bin/bash -n get_netinfo-error.sh
get_netinfo-error.sh:行19: 寻找匹配的 `"' 是遇到了未预期的文件结束符
get_netinfo-error.sh:行20: 语法错误: 未预期的文件结尾
检查语法调试
[root@localhost ~]# /bin/bash -v get_netinfo-error.sh
#!/bin/bash
:<<!
功能:获取当前主机的网卡设备信息
版本:V0.1
!
# 获取ip地址信息
ifconfig eth0 | grep -w inet | awk '{print $2}' | xargs echo "IP: "
IP: 10.0.0.12
# 获取掩码地址信息
ifconfig eth0 | grep -w inet | awk '{print $4}' | xargs echo "NetMask: "
NetMask: 255.255.255.0
# 获取广播地址信息
ifconfig eth0 | grep -w inet | awk '{print $6}' | xargs echo "Broadcast: "
Broadcast: 10.0.0.255
# 获取MAC地址信息
ifconfig eth0 | grep ether | awk '{print $2}' |xargs echo "MAC Address:
get_netinfo-error.sh:行19: 寻找匹配的 `"' 是遇到了未预期的文件结束符
get_netinfo-error.sh:行20: 语法错误: 未预期的文件结尾
脚本跟踪实践
失败演示
[root@localhost ~]# /bin/bash -x get_netinfo-error.sh
+ :
+ ifconfig eth0
+ awk '{print $2}'
+ grep -w inet
+ xargs echo 'IP: '
IP: 10.0.0.12
+ ifconfig eth0
+ grep -w inet
+ awk '{print $4}'
+ xargs echo 'NetMask: '
NetMask: 255.255.255.0
+ ifconfig eth0
+ grep -w inet
+ xargs echo 'Broadcast: '
+ awk '{print $6}'
Broadcast: 10.0.0.255
get_netinfo-error.sh:行19: 寻找匹配的 `"' 是遇到了未预期的文件结束符
get_netinfo-error.sh:行20: 语法错误: 未预期的文件结尾
成功演示
[root@localhost ~]# /bin/bash -x get_netinfo.sh
+ :
+ ifconfig eth0
+ awk '{print $2}'
+ grep -w inet
+ xargs echo 'IP: '
IP: 10.0.0.12
+ ifconfig eth0
+ grep -w inet
+ awk '{print $4}'
+ xargs echo 'NetMask: '
NetMask: 255.255.255.0
+ ifconfig eth0
+ grep -w inet
+ awk '{print $6}'
+ xargs echo 'Broadcast: '
Broadcast: 10.0.0.255
+ ifconfig eth0
+ grep ether
+ awk '{print $2}'
+ xargs echo 'MAC Address: '
MAC Address: 00:0c:29:23:23:8c
3.6 脚本开发规范
开发规范、规范解析
开发规范
脚本规范
1、脚本命名要有意义,文件后缀是.sh
2、脚本文件首行是而且必须是脚本解释器
#!/bin/bash
3、脚本文件解释器后面要有脚本的基本信息等内容
脚本文件中尽量不用中文注释;
尽量用英文注释,防止本机或切换系统环境后中文乱码的困扰
常见的注释信息:脚本名称、脚本功能描述、脚本版本、脚本作者、联系方式等
4、脚本文件常见执行方式:bash 脚本名
5、脚本内容执行:从上到下,依次执行
6、代码书写优秀习惯;
1)成对内容的一次性写出来,防止遗漏。
如:()、{}、[]、''、``、""
2)[]中括号两端要有空格,书写时即可留出空格[ ],然后再退格书写内容。
3)流程控制语句一次性书写完,再添加内容
7、通过缩进让代码易读;(即该有空格的地方就要有空格)
规范解析
编写梳理
shell脚本开发规范重点:2-4-5
shell脚本开发小技巧:3-6-7
其他技巧
1 尽可能记忆更多的命令
2 掌握脚本的标准的格式
3 多看、多模仿、多思考