Linux Shell编程整理

第一个Shell脚本例子

whologged.sh:

#!/bin/bash

cd  #切换到用户根目录,因为.bash_profile在根目录下

. .bash_profile #配置用户的命令行环境

date #显示日期命令

who #显示当前的登陆用户

执行过程:

chmod u+x whologged.sh#为whologged.sh脚本赋可执行权限

正则表达式

\<\> 精确匹配符号

\{n\} 匹配前面字符出现n次

\{n,\} 匹配前面字符至少出现n次

\{n,m\} 匹配前面字符出现n~m次

我们知道 ^ 符号表示匹配行首,但是,^ 符号放到 [] 符号中就不再表示匹配行首了,而是表示取反符号。如 [^b-d]表示不在b~d范围之内的所有字符。

正则表达式的扩展

匹配0个或1个在其之前的那个普通字符

+ 匹配1个或多个在其之前的那个普通字符

() 表示一个字符集合或用在expr中

grep命令 GREP是Global search Regular Expression and Print out the line的简称,即全面搜索正则表达式并把行打印出来。

grep的一般格式为:

grep [选项] [模式] [文件...]

例: 匹配.pem为后缀文件中以横杠(-)开头的行,可输入如下所示的命令:

# grep ^- *.pem

查找空开行,只打印行数非空白行

# grep -c ^$ 00.pem# grep -c ^[^$] 00.pem

或字符“|”是扩展的正则表达式中定义的,grep需要加上-E选项才能支持它,例如:

# grep -E "OU | seu" 00.pem#带-E选项的grep执行成功

文件的排序合并和分割

sort命令 ,是一种对文件排序的工具。

-t 选项 sort命令是分域对文件进行排序的,默认的域分隔符是空格符,-t选项可用于设置分隔符。如:

# sort  -t:  CARGO.db#以默认方式对CARGO.db文件排序

-k 选项 sort命令默认情况下是按第1域进行排序的,也可以按指定某个域进行排序,-k选项就是用于指定域的。sort命令以1表示第1域、以2表示第2域,以此类推。

例如: # sort  -t:  -k3  CARGO.db#根据第3域对CARGO.db排序

-n 选项 如果需要根据笔记本价格从小到大的方式对CARGO.db文件进行排序,即以第3域的数字大小对CARGO.db文件排序,这时就需要使用-n选项,-n选项可以指定根据数字大小进行排序。如:# sort  -t:  -k3n  CARGO.db

-r 选项 用于将排序结果逆向显示。如: # sort  -t:  -k3nr  CARGO.db

-u 选项 用于去除排序结果中的重复行,如: # sort  -t:  CARGO.db#根据第1域对CARGO.db排序

-o 选项 sort命令默认将排序后的结果输出到屏幕上,如果需要将结果保存到另一个文件中,我们可以使用-o选项。如:

# sort  -t:  -k3n  -o  SORT_CARGO.db  CARGO.db

-m选项 用于将两个排好序的文件合并成一个排好序的文件,在文件合并前,他们必须已经排好序。如:

# sort  -t:  -m  CARGO2.db  SORT_CARGO.db#合并两个文件

uniq命令 用于去除文本文件中的重复行。如:uniq  CARGO3.db

join命令 用于实现两个文件中记录的连接操作,简言之,连接操作将两个文件中具有相同域的记录选择出来,再将这些记录所有的域放到一行。如:

# join  -t:  TEACHER.db  TEACHER_HOBBY.db

cut命令 用于冲标准输入或文本文件中按域或行提取文本,基本格式: cut  [选项]  文件

paste命令 用于将文本文件或标准输出中的内容粘贴到新的文件,它可以将来自不同文件的数据粘贴到一起,形成新的文件。

split命令 用于将大文件切割成小文件,split命令可以按照文件的行数、字节数切割文件,并能在输出的多个小文件中自动加上编号。

tar命令 tar命令是Linux的归档命令,通俗地讲,tar命令实现了Linux系统文件的压缩和解压缩,类似于windows下的winrar软件。

-c 选项 创建新的包

-f 选项 使用压缩文件或设备,该选项通常是必选的

-r 选项 为包添加新的文件

-t 选项 列出包内容

-v 选项 详细报告tar处理文件的信息

-z 选项 用gzip压缩和解压缩文件,若加上此选项创建压缩包,那么解压缩时也需要加上此选项

例如: # tar  -cf  db.all  *.db    #将所有.db结尾的文件放入压缩包

# tar -tf  db.all#查看db.all压缩包的内容

# tar -rf db.all log*#将以log开头的文件添加到db.all中


tar  -xvf  压缩包名称#解压非gzip格式的压缩包

tar  -zxvf 压缩包名称#解压gzip格式的压缩包

当然使用gzip命令-d 选项也可将db.all.gz文件还原到db.all文件。如:# gzip -d db.all.gz

第五章 变量和引用

变量是某个值的名称,引用变量值就成为变量替换,$符号是变量替换符号,如variable是变量名,那么,$variable就表示变量的值。变量赋值有两种形式:

variable = value

${ variable = value}

利用unset命令可以清楚变量的值,如: unset 变量名

环境变量

环境变量不仅在Shell编程方面,而且在Linux系统管理方面,都起着非常重要的作用。

定义环境变量的格式:

ENVIRON-VARIABLE = value#换将变量赋值

export  ENVIRON-VARIABLE #声明环境变量

在给环境变量赋值后,用export命令声明一下,就说明此变量为环境变量,环境变量的名称一般由大写字母组成。

如: # APPSPATH = /usr/local

# export APPSPATH

# echo $APPSPATH

如果要列出系统中所有的环境变量,可使用env命令。用unset清除环境变量。

重要的环境变量

1、PWD和OLDPWD

PWD记录当前的目录路径,当利用cd命令改变当前目录时,系统自动更新PWD的值,OLDPWD记录旧的工作目录。

2、PATH

PATH是Linux中一个极为重要的环境变量,它用于帮助Shell找到用户所输入的命令。

如果需要在PATH中添加新目录,可以使用: export PATH = "/new directory":$PATH

3、HOME

HOME记录当前用户的根目录

4、SHELL

SHELL变量保存默认的Shell值,默认的值为/bin/bash,表示当前的Shell是bash Shell。

5、USER和UID

USER和UID是保存用户信息的环境变量,USER表示已登录用户的名字,UID表示已登录用户的ID 。

6、PPID

PPID是创建当前进程的进程号,即当前进程的父进程号。

7、PS1和PS2

PS1和PS2称为提示符变量,用于设置提示符格式。

8、IFS

IFS用于指定Shell域分隔符,默认值为空格。如: # export IFS=:表示重新设置IFS变量的值,它将IFS设定为冒号。

几个环境变量配置文件

由于Linux环境变量的数量较多,因此,系统管理员通常不会利用export逐个设置环境变量,而是将export命令放置在特殊的配置文件之中,Shell能够在特定时刻执行这些配置文件,从而自动完成环境变量的配置工作。现介绍.bash_profile、.bashrc和.bash_logout三个配置文件,这三个文件存在于用户根目录,即$HOME目录,Linux中以“.”开头的文件为隐藏文件。

$HOME/.bash_profile是最重要的配置文件,当某Linux用户登录时,Shell会自动执行.bash_profile文件,如果.bash_profile文件不存在,则自动执行系统默认的配置文件/etc/profile。

第六章 变量的高级用法

内部变量知识能够对bash Shell脚本行为产生影响的变量,它们对Shell及其子Shell都有效。因此,内部变量属于环境变量的范畴。

1、BASH

BASH记录了bash Shell的路径,通常为/bin/bash,内部变量SHELL就是通过BASH的值确定当前Shell的类型。

2、BASH_SUBSHELL

BASH_SUBSHELL记录了子Shell的层次,这个变量在bash版本3之后才出现的。

3、BASH_VERSINFO

BASH_VERSINFO是一个数组,包含6个元素,这6个元素用于表示bash的版本信息。

4、BASH_VERSION

Linux系统的bash Shell版本包含主次版本、补丁级别、编译版本和发行状态,即BASH_VERSINFO数组取值为0~4。

5、DIRSTACK

它显示目录栈的栈顶值,栈是一种现行数组结构,遵循后劲先出的原则。

6、GLOBLGNORE

GLOBLGNORE是由冒号分隔的模式列表,表示通配时忽略的文件名集合。

7、GROUPS

GROUPS记录了当前用户所属的群组,Linux的一个用户可同时包含在多个组内,因此,GROUPS是一个数组,数组记录了当前用户所属的所有群组号。

8、HOSTNAME

HOSTNAME记录了主机名,Linux主机名是网络配置时必须要设置的参数,我们一般在/etc/sysconfig/network文件中设置主机名。

9、HOSTTYPE和MACHTYPE

它们都一样,都用于记录系统的硬件架构。

10、OSTYPE

OSTYPE记录了操作系统类型,Linux系统中,$OSTYPE=linux.

11、REPLY

REPLY变量与read和select命令有关。read命令用于读取标准输入的变量值

12、SECONDS

SECONDS记录脚本从开始执行到结束所耗费的事件,以秒为单位。

13、SHELLOPTS

SHELLOPTS记录了处于"开"状态的Shell选项列表,它是一个只读变量。

set  -o  optionname#打开名为optionname选项

set  +o optionname#关闭名为optionname选项

14、SHLVL

SHLVL记录了bash Shell嵌套的层次,一般来说,我们启动第一个Shell时,$SHLVL=1,如果在这个Shell中执行脚本,脚本中的SHLVL为2,如果脚本再执行子脚本,子脚本中的SHLVL就变为3.

15、TMOUT

TMOUT变量用于设置Shell的过期时间,当TMOUT不为0时,Shell在TMOUT秒后将自动注销。

字符串处理

expr是Linux中一个功能十分强大的命令,它引出通用求值表达式,可以实现算术操作、比较操作、字符串操作和逻辑操作等功能。

1、${#string}和expr length "$string" 计算字符串长度的方法,注意string包含空格时必须用引号。

2、expr index $string $substring 索引

expr索引命令的功能在字符串$string 上匹配$substring中字符第一次出现的位置,若匹配不到则返回0.

3、expr match $string $substring

expr match命令在string的开头匹配substring字符串,返回匹配到的substring字符串的长度,若string开头匹配不到substring,则返回0.substring可以是字符串或正则表达式。

4、抽取子串

#{string : position}

#{string : position : length}

上面两条命令都是从string的左边开始计数抽取子串,还可以从右边开始计数抽取子串:

#{string: -position}#冒号和横杠符号之间有一个空格符

#{string:(position)}#冒号和左括号之间未必要有空格

接下来,我们使用正则表达式抽取子串的命令,使用正则表达式只能抽取string开头处或结尾处的子串,抽取string开头处子串的命令有一下两种格式:

expr match $string  '\($substring\)'

expr $string : '\($substring\)'#冒号前后都有一个空格

抽取string结尾处子串的命令同样有以下两种格式:

expr match $string '.*\($substring\)'

expr $string : '.*\($substring\)'#冒号前后都有一个空格

5、删除子串

${string#substring}#删除string开头处与substring匹配的最短子串

${string##substring}#删除string开头处与substring匹配的最长子串




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值