shell脚本编程基础

本文转自 http://mprc.pku.edu.cn/mentors/training/TrainingCourses/material/ShellProgramming.HTM#_Toc37518063
七种文件类型

正则表达式

字符类描述

shell的引号类型

变量设置时的不同模式:

条件测试

命令执行顺序

脚本调试

一些常用的小TRICK

打印一些头信息

创建一个长度为0的空文件

一些常用的shell变量

$0的使用

Shift的运用

用head或tail指令指定查阅的行数

AWK使用规则

第一个 awk

多个字段

外部脚本

BEGIN 和 END 块

规则表达式和块

条件语句

数值变量

字符串化变量

众多运算符

字段分隔符

字段数量

记录号

多行记录

OFS 和 ORS

将多行转换成用 tab 分隔的格式

循环结构

for 循环

break 和 continue

数组下标字符串化

数组工具

格式化输出

字符串函数

一些更耐人寻味的函数

字符串替换

特殊字符串形式

SED使用规则

sed 示例

另一个 sed 示例

地址范围

带规则表达式的地址

有关地址的更多内容

替换

规则表达式混乱

更多字符匹配

高级替换功能

组合使用

一个地址的多个命令

附加、插入和更改行

使用 sed 的几个示例

LINUX常用脚本和函数

LINUX常用命令

关于文件/目录处理的指令:

关于 Process 处理的指令:

关于字符串处理的指令:

联机查询的指令:

网络运用指令:

VI常用技巧

Shell脚本编程的常识

七种文件类型

d            目录                                                    
l            符号链接
s            套接字文件       
b            块设备文件
c            字符设备文件     
p            命名管道文件
-            普通文件

正则表达式

从一个文件或命令输出中抽取或过滤文本时。可使用正则表达式(RE),正则表达式是一些特殊或不很特殊的字符串模式的集合。
** 基本的元字符集:**

^                   只匹配行首。
$                   只匹配行尾。
*                   一个单字符后紧跟*,匹配0个或多个此单字符。
[]                  匹配[]内字符,可以是一个单字符,也可以是字符序列。可以使用-来表示[]内范围,如[1-5]等价于[1,2,3,4,5]。
\                   转义字符,屏蔽一个元字符的特殊含义,如\$表示字符$,而不表示匹配行尾。
.                   匹配任意单字符。
       
pattern\{n\}        匹配pattern出现的次数n
pattern\{n,\}       匹配pattern出现的次数,但表示次数最少为n
pattern\{n,m\}      匹配pattern出现的次数在n与m之间(n,m为0-255)

几个常见的例子:

显示可执行的文件:        ls –l | grep …x...x..x
只显示文件夹:            ls –l | grep  ^d
匹配所有的空行:          ^$
匹配所有的单词:          [A-Z a-z]*
匹配任一非字母型字符:     [^A-Z a-z]
包含八个字符的行:         ^……..$(8个.)

字符类描述

以下是可用字符类的相当完整的列表:
[:alnum:] 字母数字 [a-z A-Z 0-9]
[:alpha:] 字母 [a-z A-Z]
[:blank:] 空格或制表键
[:cntrl:] 任何控制字符
[:digit:] 数字 [0-9]
[:graph:] 任何可视字符(无空格)
[:lower:] 小写 [a-z]
[:print:] 非控制字符
[:punct:] 标点字符
[:space:] 空格
[:upper:] 大写 [A-Z]
[:xdigit:] 十六进制数字 [0-9 a-f A-F]

尽可能使用字符类是很有利的,因为它们可以更好地适应非英语 locale(包括某些必需的重音字符等等).
shell的引号类型

shell共有四种引用类型:
“” 可引用除 $、` 、\ 、外的任意字符或字符串,“ ”中的变量能够正常显示变量值。
‘’ 与“ ”类似,不同在于shell会忽略任何的引用值。
              例如: GIRL=‘girl’
                        echo “The ‘$GIRL’ did well”
              则打印:The ‘girl’ did well
`` 用于设置系统命令的输出到变量,shell会将``中的内容作为一个系统命令并执行质。
              例如:echo `date` 则打印当前的系统时间。
\  转义字符,用来屏蔽特殊含义的字符:&  *  +  ^  $  `  “  |  ?
              例如:expr 12 \* 12 将输出144

单引号和双引号都能关闭shell对特殊字符的处理。不同的是,双引号没有单引号严格,单引号关闭所有有特殊作用的字符,而双引号只要求shell忽略大多数,具体的说,就是①美元符号②反引号③反斜杠,这3种特殊字符不被忽略。 不忽略美元符号意味着shell在双引号内部也进行变量名替换。

变量设置时的不同模式:

valiable_name=value           设置实际值到 variable_name中
valiable_name+value           如果设置了variable_name,则重设其值
valiable_name:?value          如果未设置variable_name,则先显示未定义用户错误信息
valiable_name?value           如果未设置variable_name,则显示系统错误信息
valiable_name:=value          如果未设置variable_name,则设置其值
valiable_name-value           同上,但取值并不设置到variable_name

条件测试
test命令用于测试字符串、文件状态和数字,expr测试和执行数值输出。

Test格式:test condition 或 [ condition ](需要特别注意的是condition的两边都要有一个空格,否则会报错),test命令返回0表示成功。
下面将分别描述test的三种测试:
文件状态测试(常用的)
-d           测试是否文件夹
-f           测试是否一般文件
-L           测试是否链接文件
-r           测试文件是否可读
-w           测试文件是否可写
-x           测试文件是否可执行
-s           测试文件是否非空

 字符串测试
五种格式: 
test  “string”
test  string_operator  “string”
test  “string”  string_operator  “string”
[ string_operator  “string” ]
[ “string”  string_operator  “string” ]
其中string_operator可以为:       =     两字符串相等
                                                               !=    两字符串不等
                                                               -z   空串
                                                               -n   非空串

数值测试
两种格式:
 “number”  number_operator  “number”
其中:number_operator 可以为:-eq  、-ne、-gt、-lt、-ge
例如:  NUMBER=130
                     [ “990”  –le  “995”  –a  “NUMBER”  -gt  “133” ]
                     (其中-a表示前后结果相“与”)

expr命令一般用于整数值,但也可以用于字符串。
格式:  expr srgument operator operator argument
例如:  expr 10 + 10
              expr 10 ^ 2 (10的平方)
              expr $value + 10

增量计数――expr在循环中最基本的用法
例如:  LOOP=0
              LOOP=`expr $LOOP + 1`
模式匹配:通过指定的冒号选项计算字符串中的字符数
例如:  value=account.doc
              expr $value : `\(.*\).doc`
              输出 account

命令执行顺序

&&               成功执行一个命令后再执行下一个
||               一个命令执行失败后再执行另一个命令
( )              在当前shell中执行一组命令(格式:(命令1;命令2; ……))
{ }              同( )
例如:  comet mouth_end || ( echo “hello” | mail dave ;exit )
             如果没有( ),则shell将直接执行最后一个命令(exit)

脚本调试
最有用的调试脚本的工具是echo命令,可以随时打印有关变量或操作的信息,以帮助定位错误。也可使用打印最后状态($?) 命令来判断命令是否成功,这时要注意的是要在执行完要测试的命令后立即输出$?,否则$?将会改变。
Set命令也可以用来辅助脚本测试:
Set –n 读命令但是不执行
Set –v 显示读取的所有的行
Set –x 显示所有的命令及其参数
(要关闭set选项,只要把-换成+就可以了,这里有点特殊,要注意一下)

一些常用的小trick
打印一些头信息

command  <<  dilimiter
……
……
dilimiter

以分界符号dilimiter中的内容作为命令的标准输入
常用在echo命令中,这样就避免了没输出一行就要使用一个echo命令,同时,输出格式的调整也相应变得简单了。

创建一个长度为0的空文件
执行 cat < file_name 命令或 touch file_name 命令。
一些常用的shell变量
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数(可大于9个)
$$ 脚本运行的当前进程的ID号
$! 后台运行的最后一个进程的ID号
$@ 与$#相同,但使用时加引号,并在引号中返回每个参数
$- 显示shell使用的当前选项
$? 显示最后命令的退出状态,0表示无错误(这个变量也常常用来打印输出,在脚本调试时标记某个shell命令或某个函数是否正确执行,但是要注意,$?记载的是最近的函数或命令的退出状态,因此打印时应该立即打印以获得正确的信息)
$0的使用
在变量中有一种位置变量$n,用来存放函数调用或脚本执行时传入的参数,其中$0表示函数名或脚本名,需要注意的是,这时的脚本名传递的是包含全路径的脚本名。从$1-$9表示传入的第一到第九个参数,这样的参数表示不能多于九个,如果多于九个,可以使用下面将要提到的shift指令来读取。
因为$0存放函数名或脚本名,因此我们可以通过echo $0来输出调用信息,但是,由于存放的是全路径名,我们可以利用一个shell命令来得到脚本名,basename $0 将得到$0中名字的部分,而与之相反的,dirname $0将得到$0中路径的部分。
Shift的运用

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容