bash的基础特性
- 引用
- 多命令执行:
- 命令行展开:~ {}
- 命令的执行状态结果
- 多命令执行
- 命令补全:$PATH
- 路径补全:TAB
- 命令hash缓存表
- 命令别名:alias, unalias
- 命令历史:history
- 文件名通配符:glob
- 变量
- bash快捷键
引用
强引用:单引号,变量引用不执行替换;
~]# echo '$SHELL'
弱引用:双引号,变量引用会被替换;
~]# echo "$SHELL"
命令引用:反向单引号,会将引号内的字符当做命令或变量执行
~]# echo `$SHELL`
命令行展开:~, {}
~:自动展开为用户的家目录,或指定的用户的家目录;
例如:cd ~
{}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;
例如:/tmp/{a,b} 相当于 /tmp/a /tmp/b
命令的执行状态结果
bash通过状态返回值来输出此结果:$?
成功:0
失败:1-255
命令执行完成之后,其状态返回值保存于bash的特殊变量 $? 中;
命令正常执行时,有的还回有命令返回值:
根据命令及其功能不同,结果各不相同;
引用命令的执行结果:
多命令执行
~]# COMMAND1; COMMAND2; COMMAND3; ...
逻辑运算:
运算数:真(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必须执行;
示例:~]# id $username || useradd $username
命令补全:$PATH
shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符串会被当作命令;
命令查找机制:
查找内部命令;
根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名;
给定的头个字符串如果能惟一标识某命令程序文件,则直接补全;
不能惟一标识某命令程序文件,再击tab键一次,会给出列表;
路径补全:TAB
在给定的起始路径下,以对应路径下的打头字串来逐一匹配起始路径下的每个文件:
tab:
如果能惟一标识,则直接补全;
否则,再一次tab,给出列表;
命令hash缓存表
系统初始hash表为空,当外部命令执行时,默认会从PATH 路径下寻找该命令,
找到后会将这 条命令的 路径记录到hash表中,当再次使用该命令时,
shell 解释器首先会查看hash表,存在将执行之,
如果不存在,将会去PATH 路径下寻找。
利用hash 缓存表可大大提高命令的调用速度
- hash 常见用法
hash 显示 hash 缓存
hash –l 显示 hash 缓存,可作为输入使用
hash –p path name 将命令全路径path起别名为name
hash –t name 打印缓存中name 的路径
hash –d name 清除name 缓存
hash –r 清除缓存
命令别名:alias, unalias
alias name=‘value’ #定义命令别名
例如: alias cdnet='cd /etc/sysconfig/network-scripts'
获取当前shell进程的所有可用别名:
~]# alias
定义别名:
~]# alias cdnet='cd /etc/sysconfig/network-scripts'
注意:仅对当前shell进程有效
撤销别名:
~]# unalias NAME
如果别名和原命令同名,想执行原命令,可以使用:
\command # 反斜杠
'command' # 反向单引号
在命令行定义的别名,仅在当前shell进程有效
如果想永久有效,需要定义在配置文件中
仅对当前用户有效: ~/.bashrc
对所有用户有效: /etc/bashrc
编辑配置给出的新配置不会立即生效
需要bash 进程重新读取配置文件
source /path/to/config_file
. /path/to/config_file
命令历史:history
显示shell进程会其会话中保存此前用户提交执行过的命令
-c: 清空命令历史;
-d offset:删除指定命令历史
-r: 从文件读取命令历史至历史列表中;
-w:把历史列表中的命令追加至历史文件中;
history #:显示最近的#条命令;
调用命令历史列表中的命令:
!#:再一次执行历史列表中的第#条命令;
!!:再一次执行上一条命令;
!STRING:再一次执行命令历史列表中最近一个以STRING开头的命令;
定制history的功能,可通过环境变量实现:
HISTSIZE :命令历史记录的条数
HISTFILE :指定历史文件,默认为~/.bash_history
HISTFILESIZE :命令历史文件记录历史的条数
HISTTIMEFORMAT=“%F %T “ 显示时间
HISTIGNORE=“str1:str2*:… “ 忽略str1 命令,str2 开头的历史
.bash_history:命令记录保存文件
控制命令历史记录的方式:
环境变量:HISTCONTROL
ignoredups:忽略重复的命令;
ignorespace:忽略以空白字符开头的命令;
ignoreboth:以上两者同时生效;
erasedups:删除 重复命令
例如:export HISTCONTROL="ignoreboth"
环境变量存放在 /etc/profile 或 ~/.bash_profile
调用上一条命令的最后一个参数:
快捷键:ESC, .
字符串:!$
利用上一个命令的第n个参数做命令:
字符串:!:n :
文件名通配符:glob
用来快速查找文件或目录
匹配模式:元字符
*:匹配任意长度的任意字符
pa*, *pa*, *pa, *p*a*
pa, paa, passwd
?:匹配任意单个字符
pa?, ??pa, p?a, p?a?
pa, paa, passwd
[]:匹配指定范围内的任意单个字符
有几种特殊格式:
[a-z], [A-Z], [0-9], [a-z0-9]
[[:upper:]]:所有大写字母
[[:lower:]]:所有小写字母
[[:alpha:]]:所有字母
[[:digit:]]:所有数字
[[:alnum:]]:所有的字母和数字
[[:space:]]:所有空白字符
[[:punct:]]:所有标点符号
pa[0-9][0-9], 2[0-9][0-9]
[^]:匹配指定范围外的任意单个字符
[^[:upper:]]
[^0-9]
[^[:alnum:]]
变量
程序:指令+数据
指令:由程序文件提供;
数据:IO设备、文件、管道、变量
程序:算法+数据结构
算法:设计解决问题的路径
变量:指向的内存空间的别名
变量赋值:name=value
变量类型:存储格式、表示数据范围、参与的运算
编程语言:
强类型变量:
变量的类型的固定的
弱类型变量:
bash把所有变量统统视作字符型;不支持浮点类型,除非借助工具
bash中的变量无需事先声明;相当于,把声明和赋值过程同时实现;
声明:类型,变量名
变量替换:把变量名出现的位置替换为其所指向的内存空间中数据;变量引用
变量引用:${var_name}, $var_name
变量名:变量名只能包含数字、字母和下划线,而且不能以数字开头;
变量名:见名知义,命名机制遵循某种法则;不能够使用程序的保留字,例如if, else, then, while等等;
bash变量类型:
本地变量:作用域仅为当前shell进程;
环境变量:作用域为当前shell进程及其子进程;
局部变量:作用域仅为某代码片断(函数上下文);
位置参数变量:当执行脚本的shell进程传递的参数;
特殊变量:shell内置的有特殊功用的变量;
$?:查看命令的执行状态结果
0:成功
1-255:失败
本地变量:作用域仅为当前shell进程;
变量赋值:name=value
变量引用:${name}, $name
"":变量名会替换为其值;
'':变量名不会替换为其值;
查看变量:set
撤销变量:unset name
注意:此处非变量引用;
环境变量:作用域为当前shell进程及其子进程;
变量赋值:
(1) export name=value 导出一个变量,子shell可用
(2) name=value
export name
(3) declare -x name=value 可导出,可指定变量类型
(4) name=value
declare -x name
变量引用:${name}, $name
例如:animal=tigger
echo "There are some ${animal}s"
注意:bash内嵌了许多环境变量(通常为全大写字符),用于定义bash的工作环境
PATH, HISTFILE, HISTSIZE, HISTFILESIZE, HISTCONTROL, SHELL, HOME, UID, PWD, OLDPWD
查看环境变量:export, declare -x, printenv, env
撤销环境变量:unset name
只读变量:
(1) declare -r name
(2) readonly name
只读变量无法重新赋值,并且不支持撤销;存活时间为当前shell进程的生命周期,随shell进程终止而终止;
bash快捷键:
Ctrl + l 清屏,相当于clear 命令
Ctrl + o 执行当前命令,并重新显示本命令
Ctrl + s 阻止屏幕输出,锁定
Ctrl + q 允许屏幕输出
Ctrl + c 终止命令
Ctrl + z 挂起命令
Ctrl + a 光标移到命令行首,相当于Home
Ctrl + e 光标移到命令行尾,相当于End
Ctrl + f 光标向右移动一个字符
Ctrl + b 光标向左移动一个字符
Alt + f 光标向右移动一个单词尾
Alt + b 光标向左移动一个单词首
Ctrl + xx 光标在命令行首和光标之间移动
Ctrl + u 从光标处删除至命令行首
Ctrl + k 从光标处删除至命令行尾
Alt + r 删除当前整行