小红帽第6集:
egrep、bash环境配置及脚本、vim编辑器
egrep及bash中的变量
egrep及扩展的正则表达式
egrep = grep -E
egrep [OPTIONS] PATTERN [FILE…]
fgrep:不支持正则表达式,而是直接搜索,这样速度较快
扩展正则表达式的元字符:
字符匹配:
.,[],[^]
次数匹配:
*,?,+,{m},{m,},{m,n},{0,n}
位置锚定:
^,$,\<,\>,\b,
分组:
(),后向引用:\1,\2,…
或者:
a|b:C|cat 表示C或者cat而不是表示Cat或cat如果要表示这种需要:(C|c)at
egrep举例如下:
[zhangshuo@localhost ~]$ #1、显示当前系统root,git,或zhangshuo用户的默认shell和UID |
bash的基础特性(4)
变量类型:决定了数据存储格式,存储空间大小,参与运算种类
字符型:
数值型:数值型又包括
整型:
浮点型:
对于强类型的语言:定义变量时必须指定类型,参与运算必须符合类型要求,调用未声明的变量会报错
对于若类型的语言(shell):无需指定类型,默认均为字符型,参与运算会自动进行隐式类型转换,变量无需事先定义可直接调用
bash中的变量的种类:
本地变量:生效范围为当前shell进程,对当前shell之外的其它shell进程包括当前shell的子进程均无效
环境变量:生效范围为当前shell进程及其子进程
局部变量:生效范围为当前shell进程中某代码片段(通常指函数)
位置变量:$1,$2,…来表示用于让脚本代码中调用通过命令行传递给它的参数
特殊变量:$?,$0,$#,$*,$@
本地变量:
变量赋值:name=”VALUE”
对于VALUE可以使用引用:
(1):可以是直接字串:name=”username”
(2):变量引用:name=”$username”
(3):命令引用:name=`COMMAND`或name=$(COMMAND)
变量引用:
””:弱引用,其中的变量引用会被替换为变量值
’’:强引用,其中的变量引用不会被替换为变量值,而保持原字符串本身
显示定义的所有变量:
命令:set
销毁变量:
命令:unset name
环境变量:
变量声明和赋值
export name=VALUE
declare -x name=VALUE
变量引用:$name,${name}
显示所有的环境变量:
命令:export
env
printenv
销毁变量: unset name
bash中许多内建的环境变量:PATH,SHELL,UID,HISTSIZE,HISTFILE,HISTCONTROL,OLD,PWD,HOME,PS1等
变量的命名法则:
1、不能使用程序中的保留字:例如if,for等
2、只能使用数字,字母及下划线,且不能以数字开头
3、尽量做到见名知义
只读变量:
使用readonly name 来定义或
declare -r name
注意:只读变量只要被定义则再改shell进程结束之前禁止修改和撤销
位置变量:
在脚本代码中调用通过命令行传递给脚本的参数
$1,$2,…对应调用第1个,第2个参数
特殊变量:
$?:命令执行状态返回值
$0:命令本身
$*:传递给脚本的所有参数当作一个字串
$@:传递给脚本的所有参数,每一个当作一个字串
$#:传递给脚本的参数的个数
在脚本中可以使用shift [n]来进行轮换
bash环境配置及脚本
bansh环境配置
bash的配置文件
按生效范围划分存在两类:
全局配置:/etc/profile /etc/profile.d/*.sh /etc/bashrc
个人配置:~/.bashrc ~/.bash_profile
按功能划分:
profile类:为交互式登陆的shell提供配置
功用:
(1)、定义环境变量
(2)、运行命令或脚本
bashrc类:为非交互式登陆的shell提供配置
功用:
(1)、定义命令别名
(2)、定义本地变量
shell登陆类别划分
交互式登陆:
直接通过终端输入账号密码登陆
使用su - username或su -l username切换致的用户
非交互式登陆
su username
图形界面下打开的终端
执行脚本运行的终端
登陆式shell获取配置文件次序
/etc/profile–>/etc/profile.d/*.sh–>~/.bash_profile–>~/.bashrc–>/etc/bashrc
非登陆式shell获取配置文件次序
~/.bashrc–>/etc/bashrc–>/etc/profile.d/*.sh
bash中的算数运算符
(1)、let var=算术表达式
(2)、var=$[算术表达式]
(3)、var=$((算术表达式))
(4)、var=$(expr arg1 arg2 arg3 …)
各算法运算表示如下
[zhangshuo@localhost ~]$ A=3 |
注意:乘法符号有些场景中需要转义
bash有内建的随机数生成器:$RANDOM 例如取出1-60中的随机数
[zhangshuo@localhost ~]$ echo "$[$RANDOM%60+1]" |
增强型赋值:let count+=1 ,let count++ ,count=$[$count+1]可以实现变量自加一
对于数值计算举例如下:
[zhangshuo@localhost bin]$ #1、写一个脚本,计算/etc/passwd文件中的第10个用户和第20个用户的id之和 |
bash中的条件测试
判断某需求是否满足,需要由测试机制来实现
注意:专用的测试表达式需要由测试命令辅助完成测试过程
测试命令:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
注意:EXPRESSION前后必须有空白字符
bash的测试类型:
数值测试:
字符串测试:
文件测试:
数值测试:
-gt:是否大于
-le:是否小于等于
-ge:是否大于等于
-eq:是否相等
-ne:是否不想等
-lt:是否小于
字符串测试:
==:是否等于
>:是否大于
<:是否小于
!=:是否不等于
=~:左侧字符串是否能够被右侧的PATTERN所匹配到
注意:此表达式一般用于[[]]测试符号中
-z “STRING”:测试字符串是否为空,空则为真,不空则为假
-n “STRING”:测试字符串是否不空,不空则为真,空则为假
bash自定义退出状态码
在脚本中需要退出的位置使用命令exit [n]
即可自定义退出状态码
注意:脚本中一旦遇到exit命令,脚本会立即终止,终止退出状态取决于exit命令后面的数字
注意:如果未给脚本指定退出状态码,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
脚本中自定义错误码举例如下:
[zhangshuo@localhost bin]$ #写一个脚本,接受一个文件路径作为参数,如果参数个数小于1,则提示用户至少应给一个参 数,并立即退出,如果参数个数不小于1,则显示第一个参数所指向的文件中的空白行数 |
vim编辑器
vim简单介绍
vi:Visual Interface 可视化接口编辑器
文本编辑器种类:
行编辑器:sed
全屏编辑器:nano,vi等
vim:vi iMproved :模式化编辑器
基本模式:
编辑模式,命令模式:
输入模式:
末行模式:
内置的命令行接口
打开文件:
vim [OPTION]…FILE…
+#:打开文件后,直接让光标处于第#行的行首
+/PATTERN:打开文件后,直接让光标处于第一个被PATTERN匹配到的行首
+:直接到文件末尾
模式转换:
编辑模式–>输入模式
i:insert,在光标所在处转为输入模式
a:append,在光标所在处后面转为输入模式
o:在当前光标所在行的下方打开一个新行转为输入模式
I:在当前光标所在行的行首转为输入模式
A:在当前光标所在行的行尾转为输入模式
O:在当前光标所在行的上方打开一个新行转为输入模式
输入模式–>编辑模式
按ESC键即可
编辑模式–>末行模式
:
末行模式–>编辑模式
按ESC键,一次不行就多按几次
关闭文件:
在末行模式下:
:q 退出
:q! 强制退出,丢弃做出的修改
:wq 保存退出
:x 保存退出
:w /PATH/TO/SOMEWHERE 保存文件内容到其他文件,相当于office下的另存为
在编辑模式下:
ZZ 按两次大写的Z直接保存退出
光标跳转:
字符间跳转:
h:光标向左移动一个字符
j:光标向上移动一行
k:光标向下移动一行
l:光标向右移动一个字符
以上命令还可以和数字组合:# COMMAND 跳转由#指定的个数的字符
单词间跳转:
w:移动到下一个单次的词首
e:移动到下一个单次的词尾
b:移动到上一个单次的词首
行首行尾跳转:
^:跳转至行首的第一个非空白字符
0:跳转至绝对行首
$:跳转至行尾
行间跳转:
# G:跳转至由#指定行
G:跳转至文件最后一行
gg,或1G:跳转至文件第一行
句间移动:
):跳转至下一句句首
(:跳转至上一句的句首
段落间移动:
{:移动到段首
}:移动到段尾
vim的编辑命令:
字符编辑:
x:删除光标处的字符
# x:删除光标处起始的#个字符
xp:交换光标所在处的字符及其后面字符的位置
删除命令:
d:删除命令,可结合光标跳转字符,实现范围删除
d$,d^,d0,dw,dw,de,db
也可以和数字键组合使用:# COMMAND
dd:删除一整行
#dd:实现多行删除
粘贴命令:
p:缓冲区保存的如果为整行,则粘贴至当前光标所在行的下方,否则则粘贴至当前光标所在处的后面
P:缓冲区保存的如果为整行,则粘贴至当前光标所在行的上方,否则则粘贴至当前光标所在处的前面
复制命令:
y:复制,使用同d一样
改变命令:
c:修改,相当于d命令后再进行输入,使用该命令也可以实现从编辑模式到输入模式的转换
替换命令:
r:替换光标所在处的字符
可视化模式:
v:按字符选定
V:按行选定
注意:可视化模式选定范围后通常会和d,c,y命令进行组合
撤销此前的编辑:
u(undo):撤销此前的操作
#u:撤销指定次数的操作
撤销此前的撤销:
Ctrl+r
重复前一个编辑操作:
.
翻屏操作:
Ctrl+f:向文件尾部翻一屏
Ctrl+b:向文件首部翻一屏
Ctrl+d:向文件尾部翻半屏
Ctrl+u:向文件首部翻半屏
vim自带的练习教程
vimtutor
vim中的末行模式:
内建的命令行接口
(1)地址定界
:start_pos,end_pos
#:具体第#行,例如2表示第2行
#,#:从左侧#表示行起始,到右侧#表示行结尾
#,+#:从左侧#表示的行起始,加上右侧#表示的行数
.:表示当前行
$:表示到最后一行
.,$-1:表示从当前行到倒数第二行
%:全文,相当于1,$
/pat1/,/pat2/:从第一次被pat1模式匹配到的行开始一直到第一次被pat2匹配到的行结束
使用方式:
后跟一个编辑命令:
d,y,w,/path/to/somewhere
r /path/from/somefile:在指定位置插入指定文件中的所有内容
(2)查找
和less命令的用法类似
/PATTERN
?PATTERN
n:与命令查找方向相同来查找下一个
N:与命令查找方向相反来查找下一个
(3)查找并替换
s:在末行模式下完成查找替换操作
s/要查找的内容/替换为的内容/修饰符
要查找的内容:可使用模式进行匹配
替换为的内容:不能使用模式,但可以使用\1,\2,等后向引用符号,还可以使用”&”引用前面查找时查找到的整个内容
修饰符:
i:忽略大小写
g:全局替换,默认情况下,每一行只替换第一次出现
例如:
.,$s/r\(..\)t/R\1t/g
%s/l…x/&er/g
1,10s/how/HOW/g
查找替换中的分隔符/可替换为其它字符,例如
s@@@ ,s###
查找替换举例如下:
[zhangshuo@localhost ~]$ #1、复制/etc/grub2.cfg至/tmp/下,用查找替换命令删除/tmp/grub2.cfg文件中的行首的空白字符 |
vim编辑器和bash条件测试
vim的多文件模式
vim打开多个文件方式
vim FILE1 FILE2 FILE3:使用vim同时打开多个文件可以在这多个文件之间进行复制粘贴等操作
:next下一个 :prev上一个 :first第一个 :last最后一个
:wall保存所有 :qall退处所有 :wqall保存退出所有
窗口分割模式
vim -o|O FILE1 FILE2
-o:水平分割
-O:垂直分割
在窗口间切换:Ctrl+w,ARROW
单文件窗口分割
Ctrl+w,s:水平分割窗口
Ctrl+w,v:垂直分割窗口
定制vim的工作特性
配置文件:永久有效
全局配置:/etc/vimrc
个人配置:~/.vimrc该文件通常不存在需要自己手动建立
末行模式下配置:对当前vim有效
配置命令:
(1)、显示行号:set number,set nu
取消显示行号:set nonumber,set nonu
(2)、括号匹配高亮显示:set showmatch,set sm
取消括号匹配高亮显示:set nosm
(3)、自动缩进:set ai,取消自动缩进:set noai
(4)、高亮搜索:set hlsearch,取消高亮搜索:set nohlsearch
(5)、忽略字符的大小写:set ic,取消:set noic
vim应用举例:
[zhangshuo@localhost ~]$ #1、复制/etc/rc.d/functions 文件至/tmp目录,替换/tmp/functions文件中的/etc/sysconfig/init为/var/log |
bash条件测试
测试方法:
test EXPRESSION
[ EXPRESSION ]
[[ EXPRESSION ]]
测试表达式的类别:
数值比较:(上面提到过了)
字符串比较:(上面提到过了)
文件测试:
存在性测试:
-a FILE:
-e FILE:文件存在性测试,存在为真,否则为假
存在及类别测试:
-b FILE:被测文件是否存在且为块设备文件
-c FILE:被测文件是否存在且为字符设备文件
-d FILE:被测文件是否存在且为目录文件
-f FILE:被测文件是否存在且为普通文件
-h FILE 或 -L FILE :被测文件是否存在且为符号链接文件
-p FILE:被测文件是否存在且为管道文件
-S FILE:被测文件是否存在且为套接字文件
文件特殊权限测试:
-g FILE:被测文件是否存在且拥有sgid权限
-u FILE:被测文件是否存在且拥有suid权限
-k FILE:被测文件是否存在且拥有sticky权限
文件权限测试:
-r FILE:被测文件是否拥有读权限
-w FILE:被测文件是否拥有写权限
-x FILE:被测文件是否拥有可执行权限
文件大小测试:
-s FILE:被测文件是否存在且非空
文件是否打开:
-t fd:fd表示文件描述符是否已经打开且与某终端相关
-N FILE:文件自从上一次被读取之后是否被修改过
-O FILE:当前有效用户是否为该文件的属主
-G FILE:当前有效用户是否为改文件的属组
双目测试:
FILE1 -ef FILE2:FILE1与FILE2是否指向同一个设备上的相同的inode
FILE1 -nt FILE2:FILE1是否新与FILE2
FILE1 -ot FILE2:FILE1是否旧与FILE2
组合测试条件:
是基于逻辑运算来实现的
两种方式:
第一种方式:
COMMAND1 && COMMAND2
COMMAND2 || COMMAND2
!COMMAND
比如:
[ -e FILE ] && [ -r FILE]
第二种方式:
&&:EXPRESSION1 -a EXPRESSION2
||:EXPRESSION1 -o EXPRESSION2
!EXPRESSION
注意这种方式必须使用测试命令进行
比如:
[ -z “$hostName” ] || [ “$hostName”==”localhost.localdomain” ]也可以用第二种方式:
[ -z “$hostName” -o “$hostName”==”localhost.localdomain” ]
[ -f /bin/cat -a -x /bin/cat ] && cat /etc/fstab
-EOF