shell脚本编程需要的知识
关于shell的预备知识
Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁即用户界面。用户把指令传给shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
脚本第一行: #!/bin/bash。 #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
使用jobs可以查看当前shell中后台执行的任务。用fg可以调到前台执行。sleep命令就是休眠的意思,后面跟数字,单位为秒,常用语循环的shell脚本中。
通配符
在Bash下,同样可以使用星号*来匹配零个或多个字符,而用问号?匹配一个字符。
输入输出重定向
输入重定向用于改变命令的输入,输出重定向用于改变命令的输出。输出重定向更为常用,它经常用于将命令的结果输入到文件中,而不是显示在屏幕上。输入重定向的命令是<,输出重定向的命令是> (即覆盖式),另外还有错误重定向2>,以及追加/附加重定向>> (即附加式) 。
Linux下设置自定义变量规则
1. 设定变量的格式为”a=b”,等号两边不能有空格。
2. 变量名只能由英文字母、数字以及下划线组成,而且不能以数字开头。
3. 当变量内容带有特殊字符(如空格)时,需要加上单引号。 例如:myname=‘Ruming Li’
4. 当变量内容中本身带有单引号,这就需要用到双引号了。 例如:myvar=“Ruming’s”
5. 如果变量内容中需要用到其他命令运行结果则可以使用反引号。 例如:mywd=`pwd`
6. 当变量内容可以累加其他变量的内容时,需要加双引号。 例如:myname=“$LOGNAME”Ruming
单引号和双引号的区别:用双引号时不会取消掉里面出现的特殊字符的本身作用(如上面的$),而使用单引号时则里面的特殊字符全部失去它本身的作用。
Linux shell中的特殊符号
* :代表零个或多个字符或数字。它可以没有任何字符,也可以有多个字符,总之有或没有都能匹配出来。
? :只代表一个任意的字符。不管是数字还是字母,只要是一个都能匹配出来。
# :这个符号在Linux中表示注释说明的意思,即”#”后面的内容会被Linux忽略掉。
\ :脱意字符,将后面的特殊符号(例如”*”,”?”,"{"等)还原为普通字符。例如:test\*的结果为test*。
| :管道符,前面多次说过,它的作用在于将符号前面命令的结果交给符号后面的命令。这里提到的后面的命令,并不是所有的命令都可以的,一般针对文档操作的命令比较常用,例如cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk等等
$ :除了用于变量前面的标识符外, ‘!$’表示上条命令中最后一个变量(或最后出现的那个事物)。例如命令ls test.txt的最后是test.txt,那么在当前命令下键入!$则代表test.txt。
$$ : 可以用作变量前面的标识符,还可以和!结合使用。
; :分号。平时我们都是在一行中键入一个命令,然后回车就运行了。如果想在一行中运行两个或两个以上的命令时,则需要在命令之间加一个分号”;”。
~ :用户的家目录(亦称主目录、登录目录或用户目录)。如果是root用户,则是 /root ;普通用户则是 /home/username。
& :如果想把一条命令放到后台执行(屏幕不显示执行情况和结果)的话,则需要加上这个符号。通常用于命令运行时间非常长的情况。
[ ] :中括号。中间为字符组合,代表中间字符中的任意一个。如 [0-9a-zA-Z] 中任一个。
正则表达式(Regular Expression) 是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。
在正则表达式中
”^”表示行的开始 ”$”表示行的结尾 那么空行则表示”^$”,如果你只想筛选出非空行,则可以使用 “grep -v ‘^$’ filename” 得到你想要的结果(-v取反)。
‘|’表示”或者”的意思
“.”表示任意一个字符。
‘?’表示一个前面的字符
‘+’表示一个或多个前面的字符
‘*’表示零个或多个前面的字符 ‘.*’表示零个或多个任意字符,空行也包含在内。
(空格) 表示参数分隔符
cmd 表示命令替换
( )小括号,分组,用以表示一个整体,例如(oo)+就表示1个’oo’或者多个’oo’。
{ }花括号,其内部为数字,表示前面的字符要重复的次数。 注意,{ }左右都需要加上脱意字符\。具体格式是 ‘\{n1,n2\}’其中n1<n2,表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次。
grep、sed、awk
grep 工具的功能其实还不够强大,它实现的只是查找功能,而它却不能实现把查找的内容替换掉。
如果用vim的时候,可以查找也可以替换,但是只局限于在文本内部来操作,而不能输出到屏幕上。
sed工具以及下面要讲的awk工具就能实现把替换的文本输出到屏幕上的功能了,而且还有其它更丰富的功能。sed和awk都是流式编辑器,是针对文档的行来操作的。
sed
sed命令格式如下:
sed 参数 功能选项 文件名或其他标准输入
sed参数如下:
-i 修改文件内容
-n 取消默认输出
sed功能选项如下:
a 追加内容到指定行后
i 插入内容到指定行前
d 删除指定行
c 用新行替换旧行(不常用)
s 对每一行第一次匹配到的内容进行替换,配合标志g可以将一行中所有匹配到的内容进行替换
p 输出指定内容,默认会输出2次匹配到的内容
打印某行的句法: sed -n ‘n’p filename 单引号内的n是一个数字,表示第几行,’p’字符表示打印。

前面grep中使用的特殊字符,如’^’, ‘$’, ‘.’, ‘*’等同样也能在sed中使用。

替换字符或字符串

awk
awk比sed更加强大,它能做到sed能做到的,也能做到sed不能做到的。
head –n2 test.txt | awk –F’:’ ‘{print $1}’ 截取文档中的某个段。
注:-F 选项的作用是指定分隔符,如果不加-F指定,则以空格或者tab为分隔符。Print为打印的动作,用来打印出某个字段。$1为第一个字段,$2为第二个字段,依次类推,有一个特殊的那就是$0,它表示整行。

注意awk的格式,-F后紧跟单引号,然后里面为分隔符,print的动作要用’{ }’括起来,否则会报错。print还可以打印自定义的内容,但是自定义的内容要用双引号括起来。
awk的内置变量
常用的变量有:
NF :用分隔符分隔后一共有多少段;
NR :行数,第几行。

shell脚本编程需要的知识的更多相关文章
- 【Shell脚本编程系列】知识储备以及建立规范的脚本
前言 学习shell脚本编程需要的知识储备: vi/vim编辑器命令 vimrc设置要熟练 基础命令,100多个要熟练 基础和常用的网络服务命令要会:nfs . rsync. inotify . la ...
- SHELL脚本编程基础知识
SHELL脚本编程基础知识 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Linux之父Linus有一句话很经典:"Talk is cheap, show me the ...
- Shell脚本编程总结及速查手册
Shell是一种编程语言, 它像其它编程语言如: C, Java, Python等一样也有变量/函数/运算符/if语句/循环控制/… 但在开始之前, 我想先理清Shell语言与Shell之间的关系. ...
- 关于shell脚本编程的10个最佳实践
每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.但大家解决问题的方式却不尽相同,这要取决于对专业知识的掌握程度.使 用命令的种类.看待问题的方式等等.对于那些处在shell脚本 ...
- 《Linux命令行与shell脚本编程大全》 第二十七章 学习笔记
第二十七章:shell脚本编程进阶 监测系统统计数据 系统快照报告 1.运行时间 uptime命令会提供以下基本信息: 当前时间 系统运行的天数,小时数,分钟数 当前登录到系统的用户数 1分钟,5分钟 ...
- Shell脚本编程具体解释
第12章 Shell脚本编程 l Shell命令行的执行 l 编写.改动权限和运行Shell程序的步骤 l 在Shell程序中使用參数和变量 l 表达式比較.循环结构语句和条件结构语句 l ...
- shell脚本编程基础
最近学习了shell脚本编程,感觉自己的脚本写的不太好,所以想把shell脚本相关的知识系统的整理一下,便于以后的学习和使用. 一.shell脚本基础 shell脚本是利用shell的功能 ...
- shell脚本编程的10个最佳实践
摘要:每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.对于那些处在shell脚本编程初级阶段的程序员来说,遵循一些恰当的做法可以帮助你更快.更好的学习这些编程技巧. 每一个在U ...
- 浅谈自底向上的Shell脚本编程及效率优化
作者:沐星晨 出处:http://blog.csdn.net/sosodream/article/details/6276758 浅谈自底向上的Shell脚本编程及效率优化 小论文,大家多批评指导:) ...
随机推荐
- TestOps - 最健壮性的测试角色
一十一 发表于 2018-03-02 09:10:08 TestOps 最具影响力的测试运维一体化综合平台. DevOps实现了从代码到服务的快速落地,而TestOps集成了DevOps效率,更是 ...
- Manjaro使用笔记-使用中国源的方法
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错!生成可用中国镜像站列表: sudo pacman-mirrors -i -c China -m rank 勾选弹窗里面的所有源刷新 ...
- WEB服务器、HTTP服务器、应用服务器、IIS
转载:https://www.cnblogs.com/brant/p/7209042.html Web服务器: 基本功能就是提供Web信息浏览服务.它只需支持HTTP协议.HTML文档格式及URL.与 ...
- Jquery插件开发之图片放大镜效果(仿淘宝)
原网转载地址:http://www.cnblogs.com/hnvvv/archive/2011/11/19/2255197.html 需求:公司某个网站,需要实现图片预览效果,并能像淘宝一样实现局部 ...
- CSS之 :before && :after的用法,伪类和伪元素的区别
一::before && :after的用法 :before 如同对伪元素的名称一样,:before 是用来给指定的元素的内容前面插入新的内容.举例说明: .before:before ...
- typescritp 导出默认接口
假如有ITest.ts文件,如下: export default interface ITest{ } 这样会报错,编译不通过.据说是设计成这样的,具体详细见:https://github.com/M ...
- 【锁】Oracle死锁(DeadLock)的分类及其模拟
[锁]Oracle死锁(DeadLock)的分类及其模拟 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不 ...
- C++ 获取当前正在执行的函数的相关信息
(我的运行环境:win10x64+vs2015通过, 有的环境KUbuntu 8.04.1 x64 g++ 4.2.3也通过了)主要通过宏来实现:(注意,开头和结尾都是两个下划线) 1. __PRET ...
- 在 Azure Resource Manager 模板中使用托管磁盘
本文介绍使用 Azure Resource Manager 模板预配虚拟机时托管与非托管磁盘之间的差异. 这有助于将现有模板从使用非托管磁盘更新为使用托管磁盘. 我们将使用 101-vm-simple ...
- 如何创建和还原SQL Server 2000数据库?
说明:这篇文章是几年前我发布在网易博客当中的原创文章,但由于网易博客现在要停止运营了,所以我就把这篇文章搬了过来,虽然现如今SQL Server 2000软件早已经过时了,但仍然有一部分人在使用它,尤 ...