bash特性
终端,附着在终端的接口程序
bash的特性:
命令行展开:~,{}
命令别名:alias, unalias
命令历史:history
文件名通配:glob
快捷键:ctrl+a,e,u,k,l
命令补全:$PATH
路径补全:
###bash特性之:hash
缓存此前命令的查找结果,缓存
-r 清空
###bash特性之:变量
变量类型:存储格式,表示数据范围,参与的运算
编程语言:
强类型变量
弱类型变量
bash把所有变量统统视作字符型
bash中的变量无需事先声明,把声明和赋值过程同时实现
声明:类型,变量名
变量替换:把变量名出现的位置替换为其所指向的内存空间中数据
变量引用:$(var_name), $var_name
变量名:变量名只能包含数字,字母和下划线,而且不能以数字开头
变量名:见名知意,命令机制遵循某种法则,不能使用程序的保留字(if,else,while等)
bash变量类型:
本地变量:作用域范围仅为当前shell进程
环境变量:作用域为当前shell进程及其子进程
局部变量:作用域仅为某代码片段(函数上下文)
位置参数变量:当执行脚本的shell进程传递的参数
特殊变量:shell内置的有特殊功用的变量
$? 返回参数 0:成功
本地变量
变量赋值:name=value
变量引用:${name}, $name
"":变量名会替换为其值
'':变量名不会替换为其值
查看变量:set
撤销变量:unset name
环境变量:
变量赋值:
1.export name=value
2.name=value,export name
3.declare -x name=value
注意:bash内嵌了许多环境变量(通常为全大写字符),用于定义bash的工作环境
查看环境变量 export, declare -x, printenv, env
只读变量:
declare -r name, readonly name
只读变量无法重新赋值,并且不支持撤销,存活时间为当前shell进程的生命周期,随shell进程的终止而终止
###bash特性之多命令执行
~]# COMMAND1; COMMAND2; COMMAND3;...
逻辑运算:
运算数:真(true,yes,on,1)
假(false,no,off,0)
与:
1 && 1 = 1
1 && 0 = 0
0 && 1 = 0
0 && 1 = 0
或:
1 || 1 = 1
1 || 0 = 1
0 || 1 = 1
0 || 0 = 0
非:
!1 = 0
!0 = 1
断路法则:
~]# COMMAND1 && COMMAND2
COMMAND1为假,则COMMAND2不会执行
否则,COMMAND1为真,COMMAND2必须执行
~]# COMMAND1 || COMMAND2
COMMAND1为真,COMMAND2不会执行
否则,COMMAND1为假,COMMAND2必须执行
~]# id $username || useradd $username
如果不存在此用户,则添加这个用户,已经存在则不添加
shell脚本编程
编程语言的分类:根据运行方式
编译运行:源代码-->编译器(编译)-->程序文件
解释运行:源代码-->运行时启动解释器,由解释器边解释边运行
是否调用库
shell脚本编程:
利用系统上的命令及编程组件进行编程
完整编程:
利用库或编程组件进行编程
编程模型:过程式编程语言,面向对象的编程语言
程序=指令+数据
过程式:以指令为中心李组织代码,数据式服务与代码;
顺序执行,选择执行,循环执行(C,bash)
对象式:以数据为中心来组织diamagnetic,围绕数据来组织指令;
类(class):实例化对象,method;(java,C++,python)
shell脚本编程:过程式编程,解释运行,依赖于外部程序文件运行
常见的解释器:
#!/bin/basj
#!/usr/bin/python
#!/usr/bin/perl
shell脚本式什么?
命令的堆积;
但很多命令不具有幂等性,需要用程序逻辑来判断运行条件是否满足,以避免其运行中发生错误;
运行脚本
1.赋予执行权限,并直接运行此程序文件
chmod +x /PATH/TO/SCRIPT_FILE
/PATH/TO/SCRIPT_FILE
2.直接运行解释器,将脚本以命令行参数传递给解释器程序;
bash /PATH/TO/SCRIPT_FILE
注意:
脚本中的空白行会被解释器忽略
脚本中,除了shebnag,余下的所有以#开头的行,都会被视作注释行而被忽略,此即为注释行
bash的配置文件:
profile类:为交互式登录的shell进程提供配置
bashrc类:为费交互式登录的shell进程提供配置
登录类型:
交互式登录shell进程
直接通过某终端输入账号密码后登录打开的shell进程
使用su命令:su - USERNAME,或者su -l USERNAME执行的的登录切换
非交互式登录shell进程
su USERNAME执行的登录切换
图形界面下打开的终端
运行脚本
profile类:
全局:对所有用户都生效
/etc/profile
/etc/profild.d/*.sh
用户个人:仅对当前用户有效
~/.bash_profile
功能:
1. 用户定义环境变量
2. 运行命令或脚本
bashrc类:
全局:/etc/bashrc
用户个人:~/.bashrc
功能:
1.定义本地变量;
2.定义命令别名
交互式登录shell进程:
/etc/profile-->/etc/profile.d/*-->~/.bash_profile-->~/.bashrc-->/etc/bashrc
非交互式登录shell进程:
~/.bashrc-->/etc/bashrc-->/etc/profile.d/*
命令行中定义的特性,例如变量和别名作用域为当前shell进程的生命周期
配置文件定义的特性,只对随后新启动的shell进程有效
让通过配置文件定义的特性立即生效
1.通过命令行重复定义一次
2.让shell经常重读配置文件
~]# source /PATH/FROM/CONF_FILE
~]# . /PATH/FROM/CONF_FILE
文本处理三剑客
grep:文本过滤工作
sed:流编辑器
awk:实现为gawk,文本报告生成器
grep
文本搜索工具,根据用户指定的模式,对目标文本逐行进行匹配检查,打印匹配到的行
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
--color=auto 对匹配到的文本高亮显示
-i 忽略字符的大小写
-o 仅显示匹配到的字符串本身
-v 反向匹配,显示不能被匹配到的行
-E 支持使用扩展的正则表达式元字符
-q 静默模式,不输出任何信息
-f 不支持基本的正则表达式
同时显示前后的行
-A n :after 后n行
-B n :before 前n行
-C n :context 前后n行
基本正则表达式远字符
字符匹配:
. :匹配任意单个字符
[] :匹配指定范围内的任意单个字符
[^] :匹配指定范围外的任意单个字符
匹配次数:用在要指定出现的次数的字符的后面,用于限制其前面字符出现的次数
* :匹配其前面的字符任意次
.* 匹配任意长度的任意字符
\? :匹配前面的字符0次或1次,即前面字符可有可无
\+ :匹配前面的字符1次或多次,即前面字符出现至少1次
\{m\} :匹配前面的字符m次
\{m,n\} :匹配前面的字符至少m次,至多n次
\{0,n\} :至多n次
\{m,0\} :至少m次
位置锚定:
^ :行首锚定;用于模式的最左侧
$ :行尾锚定;用于模式的最右侧
^PATHE$ :用于PATHE来匹配整行
^$ :空白行
^[[:space:]]*$ :空行或包含空白字符的行
单词:非特殊字符组成的连续字符(字符串)都称为单词
\<或\b :词首锚定
\>或\b :词尾锚定
\ :匹配完整单词
分组及引用
\(\) :将一个或多个字符捆绑在一起,当作一个整体进行处理
\(xy\)*ab xy作为一个整体
分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为
\1 :模式从左侧起,第一个括号匹配到的字符
\2 :第二个括号匹配到的字符
...
grep "\(l..e\).*\1" lovers.txt
后向引用:引用前面的分组括号中的模式所匹配到的字符
egrep
相当于grep -E 支持扩展的正则表达式
唯一的区别,就是可以少一些转义符\
匹配次数:用在要指定出现的次数的字符的后面,用于限制其前面字符出现的次数
* :匹配其前面的字符任意次
.* 匹配任意长度的任意字符
? :匹配前面的字符0次或1次,即前面字符可有可无
+ :匹配前面的字符1次或多次,即前面字符出现至少1次
{m} :匹配前面的字符m次
{m,n} :匹配前面的字符至少m次,至多n次
{0,n} :至多n次
{m,0} :至少m次
分组也可以不加\
分组及引用()
或:
a|b :a或者b
C|cat :C或者cat
(c|C)at :cat或Cat
找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行
[root@cloud~]#grep-E"[_[:alnum:]]+\(\)"/etc/rc.d/init.d/functions
找出路径的基名
[root@cloud~]#echo/etc/sysconfig|grep-E-o"[^/]+$"
ifconfig中提取ip
[root@cloud~]#ifconfig|grep-v'127.0.0.1'|grep-E-o'inet.*netmask\>'|grep-E-o"\<[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\>"
/etc/passwd中提取用户名和shell相同的用户信息
[root@cloud~]#grep-E"^([^:]+\>).*\1$"/etc/passwd
fgrep 不支持正则表达式元字符
文本查看及处理工具
@hxjagf2017-01-03 23:06字数3988阅读0