bash基础特性之:命令历史
**history命令**
shell进程会在其会话中保存之前用户提交执行过的命令
# history
定制history的功能,可通过环境变量实现
$HISTSIZE:shell进程可保留的命令历史的条数,默认为1000条
$HISTFILE:持久保存命令历史的文件
注意:命令历史文件不会保存本次登录shell后所执行的命令,每次退出时都会自动的将内存中的命令写入至命令历史文件中去
history命令显示出来的命令是包含命令历史文件中及内存中的所有命令
cat命令历史文件仅显示上次登出以前的所有命令
$HISTFILESIZE:定义命令历史文件最多保留多少条历史命令
注意:当历史命令及历史命令文件达到最大值,将新的命令加入进去且将之前的第一个命令以此删除,以此类推
格式:history [-c] [-d 偏移量] [n]
或 history -anrw [文件名]
或 history -ps 参数[参数]
-c:清空命令历史,仅删除内存中的历史命令,不会删除命令历史文件中的命令
-d:删除指定命令
-r:将命令历史文件中的内容读取至内存命令历史中
-w:把历史文件中的命令追加至历史文件中
#:history #,#为数字,表示显示最近#条命令
**调用命令历史列表中的命令:**
!#:再一次执行历史列表中的第#条命令
!!:再一次执行上一次命令
!STRING:再一次执行命令历史列表中最近一个以STRING开头的命令 STRING:字符串
注意:命令的重复执行有时候需要依赖幂等性,幂等性就是重复N次效果是相同的,不能出错
**调用上一条命令的最后一个参数:**
快捷键:ESC , .
字符串:!$
**控制命令历史记录的方式:**
环境变量:HISTCONTROL
其取值可以有三个:
默认:ignoredups:忽略重复的命令
lgnorespace:忽略以空白字符开头的命令
ignoreboth:以上两者同时生效
修改变量的值:
NAME="VALUE"
注意:仅对当前shell有效
**命令的执行状态结果:**
bash通过状态返回值来输出此结果
成功:0
失败:1-255
命令执行完成之后,其状态返回值会保存于bash的特殊变量$?中;
命令正常执行时,有的还会有命令返回值;根据命令及其功能不同,结果各不相同
**引用命令的执行结果:**
$(COMMAND)
`COMMAND`
建议使用$(COMMAND)
**引用:强引用;弱引用**
强引用:' '
弱引用:" "
**快捷键:**
ctrl+a:跳转至命令行行首
ctrl+e:跳转至命令行行尾
ctrl+u:删除行首至光标所在处之间的所有字符
ctrl+k:删除光标所在处至行尾的所有字符
ctrl+l:相当于clear;清屏
**命令补全:**
shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符串会被当作命令
查找机制:
首先查找别名,如果没有就下一步
查找内部命令,如果没有就下一步
根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名
给定的打头字符串如果能唯一标识某命令的程序文件,则直接补全,否则
如果不能唯一标识某命令程序文件,再击一次tab键,会给出列表
**路径补全:**
在给定的起始路径下,以对应路径下打的打头字串逐一匹配起始路径下的每个文件
tab:
如果能唯一标识,则直接补全
否则,再一次tab,则给出列表
**命令行展开:**
~:自动展开为用户的家目录,或指定的用户的家目录
{ }:可承载一个以逗号分隔的路径列表,并将其展开为多个路径
问题一:如何创建/tmp/x/y1 /tmp/x/y2 /tmp/x/y1/a /tmp/x/y1/b ?
mkdir -pv /tmp/x{y1/{a,b},y2}
问题二:如何创建a_c a_d b_c b_d
mkdir -pv {a,b}_{c,d}
**命令的状态执行结果:**
bash通过状态返回值来输出此结果
成功:0
失败:1-255
命令执行完成之后,其状态返回值会保存于bash的特殊变量 $? 中
命令正常执行时,有的还会有命令返回值
根据命令及其功能不同,结果各不相同
**引用命令的执行结果:**
$(COMMAND)
`COMMAND`
建议使用 $(COMMAND)
**引用:强引用,弱引**
强引用:' '
弱引用:" "
**快捷键:**
Ctrl+a:跳转至命令行行首
Ctrl+e:跳转至命令行行尾
ctrl+u:删除行首至光标所在处之间的所有字符
Ctrl+k:删除光标所在处至行尾的所有字符
Ctrl+l:清屏;相当于clear
globbing:文件名通配(整体文件名匹配,而非部分)
匹配模式:元字符
*:匹配任意长度的任意字符
?:匹配任意单个字符;注意:任意单个字符是必须得有一个字符
[ ]:匹配指定范围内的任意单个字符
例如:[abcd]、[123ok]
有几种特殊格式:
[a-z]、[A-Z]、[0-9]、[a-z0-9]、[abclsk]
注意:范围内的字符不区分大小写,比如上边前两个,只有专门的指定范围才区分大小写
[[:upper:]]:任意单个大写字母
[[:lower:]]:任意单个小写字母
[[:alpha:]]:所有字母,相当于[a-z]、[A-Z]
[[:digit:]]:所有任意单个数字
[[:alnum:]]:所有任意单个的字母或数字
[[:space:]]:任意单个空白字符
[[:punct:]]:任意单个标点符号
[^]:匹配指定范围外的任意单个字符
例如:[^[:upper:]]:匹配大写字母以外任意单个字符和数字,只要不是大写字母就行
[^0-9]:匹配任意字符除0-9数字
bash的特性之:变量
程序由指令和数据组成 指令由程序文件提供 数据:IO设备、文件
程序:算法+数据结构
变量名+指向的内存空间=变量
变量赋值:NAME=VALUE
变量类型:存储格式、表示数据范围、参与的运算
编程语言:强类型变量、弱类型变量
bash shell默认把所有变量统统视作为字符类型、不支持浮点类型、bash中的变量无需事先声明;相当于,把声明和 赋值过程同时实现
声明:类型、变量名
变量替换:把变量名出现的位置替换为其所指向的内存空间中的数据
变量引用:${VAR_NAME}、$VAR_NAME
变量名命名规则:变量名只能包含数字、字母和下划线,且不能以数字开头;见名之意,命名机制遵循某种法则, 不能使用程序的保留字,例如if、else
bash变量类型:
本地变量:作用域仅为当前shell进程
环境变量:作用域仅为当前shell进程及其子进程
局部变量:作用域仅为某代码片段(函数上下文)
位置参数变量:向执行脚本的shell进程传递的参数
特殊变量:shell内置的有特殊功用的变量
变量赋值:
本地变量:
变量赋值:NAME=VALUE
变量引用:${NAME},$NAME
" " :双引号是弱引用;变量名会替换为其值
' ' :单引号是强引用;变量名不会替换为其值
查看变量:# set 命令
撤销变量:# unset NAME
注意:此处非变量引用
环境变量:
变量赋值:
(1)# export NAME=VALUE
(2)# NAME=VALUE
# export NAME
(3)# declare -x NAME=VARLUE
(4)# NAME=VALUE
# declare -x NAME
变量引用:${NAME},$NAME
注意:bash内嵌了许多环境变量(通常为大写字符),用于定义bash的工作环境
例如:PATH/HISTFILE/HISTSIZE/HISTFILESIZE/HISTCONTROL/SHELL/HOME/UID/PWD
查看环境变量:
export,declare -x,printenv,env
撤销环境变量:# unset NAME
只读变量:
(1)declare -r NAME
(2)readonly NAME
只读变量无法重新赋值,并且不支持撤销;存活时间为当前shell进程的生命周期,随shell进程终止而终止
bash特性之多命令执行:
# COMMAND1;COMMAND2;COMMAND3;COMMANDN;COMMAND;...
逻辑运算:
运算数:真或假
真:true,yes,on,1
假:false,no,off,0
与运算:&&
1 && 1 = 1
1 && 0 = 0
0 && 1 = 0
0 && 0 = 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必须执行