linux egrep及bash条件测试

时间:2022-10-13 01:07:59

egrep及扩展的正则表达式

egrep = grep -E

扩展正则表达式的元字符

字符匹配:

.  []  [^]

次数匹配:

* :任意次

?:01

+ 1次或多次

{m}:匹配m

{m,n}:至少m至多n

锚定:

^  $  \<, \b词首   \>,\b词尾

分组:

()

后向引用:\1 , \2

或者:

a|b

 

fgrep:“快速搜索机制”不支持正则表达式,仅仅找给定的字符串

 

bash的基础特性:

变量类型:

数据存储格式、存储空间大小,参与运算种类

 

强类型:定义变量时必须指定类型,参与运算必须符合类型要求

弱类型:无需指定类型,默认均为字符型,参与运算会自动进行隐式类型转换

 

bash中变量的种类:

根据变量的生效范围等标准

本地变量:生效范围为当前shell进程,对其他进程(包括子shell)都无效

环境变量:生效范围为当前shell进程及其子进程

局部变量: 生效范围为当前shell进程中某代码片段(通常指函数)

位置变量:$1,$2,.. 来表示,用于让脚本在脚本代码中调用通过命令行传递给它的参数

特殊变量:$? 返回状态   $0命令本身  $*  $@  &#

 

本地变量:

变量赋值:name=’value’

可以使用引用

value:

(1).可以是直接字符串 name=”username”

(2).可以是变量引用name =“$username”

(3).可以命令引用 name=`COMMAND`(反引号) , name=$(COMMAND)

变量引用:${name} , $name

“”:弱引用,其中的变量引用会被替换为变量值

‘’:强引用,保持原字符串

显示已定义的所有变量:set

销毁变量:unset name

环境变量:

变量声明、赋值

export name=VALUE

declare -x name=VALUE 导出变量

变量引用:$name , $(name)

显示所有环境变量:

export   env   printenv

销魂变量:

unset name

 

bash有许多内建的环境变量:PATH , SHELL , UID , HISTSIZE , PWD

 

变量命名法则:

1.不能使用保留字

2.只能使用数字、字母及下划线,且不能以数字开头

3.见名知义

 

位置变量:

在脚本代码中调用通过命令行传递给脚本的参数

$1 , $2 ..  对应调用第1、第2等参数

shift [n] 轮换操作

$0 : 命令本身

$*: 传递给脚本的所有参数(总体当做一个字符串)

$@: 传递给脚本的所有参数(分别当做一个字符串)

$#: 传递给脚本的参数个数

 

实例:判断给出的文件的行数

#!/bin/bash

linecount = “$(wc -l $1 | cut -d ‘ ’ -f1)”

echo “$1 has $linecount lines.”

 

bash 配置文件

按生效范围划分为两类:

全局配置:

/etc/profile

/etc/bashrc

个人配置:

~/.bash_profile

~/.bashrc

功能:

(1)定义命令别名

(2)定义本地变量

 

按功能划分为两类

profile类:为交互式登录的shell提供配置

bashrc类:为非交互式登录的shell提供配置

 

shell登录:

交互式登录:

直接通过终端输入账号密码登录

使用su - UserName” 切换的用户

 

读取顺序: /etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile -->~/.bashrc --> /etc/bashrc

非交互式登录:

su UserName

图形界面下打开的终端

执行脚本

 

读取顺序: ~/.bash_profile -->~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh

 

编辑配置文件定义的新配置的生效方式:

(1)重新启动shell进程

(2)使用source  .命令进程

 

问题:

1.定义对所有用户都生效的别名? 定义在 /etc/bashrc

2.让用户的PATH环境变量的值多出一个路径 例:多出/uer/local/apache2/bin

管理员

所有

 

bash中的算术运算:

(1) let  var=算术表达式

(2) var=$[算术表达式]

(3) var=$((算术表达式))

(4) var=$(expr arg1 arg2 arg3 ...)

注:* 符号有时需转义

bash有内建的随机数生成器:$RANDOM

 

增强型赋值:

+= -=*=/+ , %=

 

条件测试:

判断某需求是否满足,需要由测试机制来实现

注:专用的测试表达式,需要由测试命令辅助完成测试结果

 

hash的测试类型

数值测试:

-gt : 否大于  -ge:是否大于等于

-eq: 是否等于  -ne:是否不等于

字符串测试:

==:是否等于

>: 是否大于

!=: 是否不等于

~=: 左侧字符串是否能够被右侧的模式所匹配

-z: “STRING”: 测试字符串是否为空,空为真,不空为假

-n: 反之

注:用于字符串比较时,用到的字符串都应该加引号””.

文件测试:

 

bash自定义退出状态码:

exit[n]: 自定义退出状态码:

注:脚本中一旦遇到exit命令,脚本会立即终止,终止退出状态码取决于exit命令后面的数字

如果未给脚本指定退出状态码,整个脚本的退出状态码,取决于脚本中执行的最后一条命令的状态码。

 

vim编辑器

vi: Visual Interface 文本编辑器

文本:ASCII  Uicode

文本编辑种类

行编辑器:sed

全屏编辑器:nano

VIM - Vi IMproved

 

使用:

vim: 模式化的编辑

基本模式:

编辑模式:命令模式

输入模式:

末行模式:内置的命令行借口

 

打开文件:

#vim [option]...  file...

+#:打开文件后,直接让光标出去第#行的行首

+/PATTERN:光标处于被匹配到的行首

 

模式转换:

编辑模式 --> 输入模式

i: insert ,在光标所在处输入

a: append 在光标所在处后面输入

o: open 在光标下面打开一个新行

 

输入模式 --> 编辑模式:  ESC

编辑模式 --> 末行模式:  : (冒号)

 

关闭文件:

:q 退出

:q! 强制退出,丢弃做出的修改

:wq 保存退出

:w /PATH/TO/SOMEWHERE

 

光标行首行尾跳转:

^: 跳转至行首的第一个非空白字符

0: 跳转至行首

$: 跳转至行尾

 

行间跳转:

#G: 跳转至有#指定行

G: 最后一行

1G , gg: 第一行

 

vim的编辑命令:

删除命令:

d: 删除命令,可结合光标跳转字符,实现范围删除

d$  d^  d0

dd: 删除光标所在行

粘贴命令:(p,put,paste)

P: 缓冲区如果为整行,则粘贴至下一行,否则粘贴至光标后面

复制命令:

y: 复制,命令类似于d

y$ , y0 , y^

yy: 复制行

#yy: 复制多行

 

撤销此前的编辑:

u(undo): 撤销此前的操作

撤销此前的撤销:

Ctrl+r


重复前一个编辑操作:

.

翻屏操作:

Ctrl+f : 向文件尾部翻一屏

Ctrl+b : 向文件首部翻一屏

 

vim中的末行模式:

内建的命令行接口

(1) 地址定界

:start_pos , end_pos

#: 具体第#

#,#: 从第#到第#

#,+#: #到加上#

. : 当前行

$ : 最后一行   例:.,$-1  当前行到倒数第二行

% : 全文,相当于1,$

 

查找并替换:

s: 在末行模式下完成查找替换操作

s#要查找的内容#替换为的内容#修饰符

g: 全局替换

 

多文件模式:

vim file1 file2 file3

:next 下一个   :first第一个

:prev 前一个   :last最后一个

 

:wall 保存所有   :qall退出所有

 

定制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

 

 

bash条件测试

测试方式:

test  EXPRESSION  []   [[]]

 

用法:
        echo -n "Enter the file name: "
        read fname
        if [ -s $fname ]
              then echo "$fname is exists and not empty!"
        else
              then echo "$fname is not exists and empty!"
         fi

 

组合测试条件:

逻辑运算:

两种方式:

(1) COMMAND1 &&(||) COMMAND2

(2) EXCEPTION  -a  EXCEPTION  

-o