Linux Shell编程整理
2013-09-13 13:52
211 查看
第一个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匹配的最长子串
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匹配的最长子串
相关文章推荐
- Linux shell编程如何不解压读取gz压缩的文本
- Linux shell 编程之while循环、until循环
- Linux shell编程之分支判断进阶
- Linux Shell编程基础
- linux shell编程for循环
- Linux Shell 编程 第一部分 Chapter1-6
- Linux shell编程(二):shell语法
- 个人整理的Linux Shell语法速查表
- 收集整理了一些开发技巧专题,并汇集成一个编程学习网站
- 整理:[保留] [算法] 超高性能网络编程, Asynchronous network I/O
- Linux 管道通讯编程整理
- linux shell 编程
- Linux Shell编程(二)--Shell变量及相关操作
- Linux Shell编程(6)——变量替换
- Linux Shell编程(14)——内部变量
- Linux Shell编程入门
- Linux shell编程之read 命令
- 整理:一些主流的编程竞赛网站对比
- Linux Shell编程(22)——时间/日期 命令
- Linux Shell编程(30)——别名