一.Shell
说到bash,首先就必须先提一下shell。Shell是什么呢?Shell是一个C语言编写的给用户提供交互的接口程序。用户的大部分操作都是通过shell完成的。
广义上Shell主要分为两类:
1.GUI图形用户界面:主要有KDE、GNOME、XFCE等
2.CLI命令行界面:bash、zsh、fish、sh、csh、tcsh等。各个发行版主要使用bash。
二.bash的特性
(一)命令别名
在linux的使用和管理过程中,将会用到大量的命令,我们可以通过命令别名来避免一些常用的长命令的频繁且繁琐的输入。
我们可以通过alias命令来获取当前用户可用的别名以及设置新的别名。
获取当前用户别名
alias NAME=‘COMMAND‘
定义别名
alias NAME=‘COMMAND‘
需要注意的是,定义别名的生命周期仅为当前shell进程。
撤销别名
ualias NAME
(二)命令历史
Shell进程会保存其会话中shell进程会保存其会话中用户曾经执行过的命令;命令通过其“历史文件”来持久保存此前执行过的命令;每个用户都有其自己专用的历史文件;
HISTSIZE:shell进程的缓冲区保留的历史命令的条数;
HISTFILESIZE:命令历史文件可保存的历史命令的条数;
我们可以通过echo $NAME 来查看,默认HISTSIZE以及HISTFILESIZE大小均为1000
HISTFILE 为当前用户命令历史文件
使用history命令查看命令历史列表
history命令的使用方法
history -c:清空命令历史
history -d:删除指定条目
例:history -d 10,与上图对比可见,原来的第10条命令已经被删除了。
history -a:将当前缓冲的历史行追加到历史文件(HISTFILE)中。
history -n:从历史文件中读取所有未被读取的行。
history -r:读取历史文件并将历史文件追加到历史列表中。
调用上一条命令的最后一个参数:快捷键:ESC, .或Alt+.
显示最近的n条件命令历史:history #
控制命令历史的记录方式主要通过HISTCONTROL环境变量进行,其取值:
ignoredups:忽略重复的命令;重复是指连续且相同的令;
ignorespace:以空白字符开头的命令不记入历史;
ignoreboth:上述两者同时生效;
查看变量值的方式,echo $HISTCONTROL修改变量值的方式:HISTCONTROL="VALUE"
(三)快捷键
Ctrl+a:跳至命令行首;
Ctrl+e:跳至命令行尾;
Ctrl+k:删除光标所在处至尾部的内容;
Ctrl+u:删除行首至光标所在处的内容;
(四)命令补全和路径补全
命令补全:shell程序在接收到用户执行命令的请求且分析完成之后,最左侧字符串将被当作命令去查找。
查找机制:
首先会查找内部命令,如果能唯一标识某命令程序文件的文件名,则直接补全,如果不能则 查找外部命令。去$PATH变量所指定的各路径下,自左而右逐个搜索各目录下的文件名;给定的打头的字符串如果能惟一标识某命令程序文件的文件名,则直接补全;不能惟一标识,再次点击tab可给出命令列表;
错误:没有任何命令可被此打头字符串标识;
路径补全:在给定的起始路径的上级目录下,以对应路径下的打头字符串来逐一匹配上级目标下的每个文件:如果能惟一标识:tab补全;不能惟一标识则再次点击tab给出列表;
错误路径:没有响应;
(五)命令行展开
把命令行的给定的特殊符号自动替换为相应字符串的机制;
~: 自动替换为用户家目录;
~USERNAME:自动替换为指定用户的家目录;
{}:可承载一个以逗号分隔的路径列表,能够将其展开为多个独立路径;
例如:/tmp/{a,b,c} =/tmp/a /tmp/b /tmp/c
/tmp/{a,b}/z =/tmp/a/z /tmp/b/z
(六)命令的执行状态结果
当一个命令执行之后会有命令的正常输出结果:命令的返回值
通过引用来保存下来或直接调用——`COMMAND`或$(COMMAND)
命令的执行状态结果:
成功:0
失败:1-255
bash用一个特殊变量来保存最一次执行的命令的状态结果:$?
注意:这个特殊变量能且只能显示上一次命令的执行状态。
(七)glob
glob:文件名通配机制;快速引用多个文件;文件名整体匹配度检测;
元字符:基于元字符可编写匹配模式(pattern);
*:匹配任意长度的任意字符;
?:匹配任意单个字符;
[ ]:匹配指定集合内的任意单个字符:
[a-z], [A-Z]:不区分字符大小写;[0-9][a-z0-9]
[[:upper:]]:所有大写字母;
[[:lower:]]:所有小写字母;
[[:digit:]]:所有的数字;
[[:alpha:]]:所有字母;
[[:alnum:]]:所有字母和数字;
[[:space:]]:空白字符;
[[:punct:]]:标点符号;
[^ ]:匹配指定集合外的任意单个字符;
例:[^[:alpha:]]
(八)变量
变量:内存空间,有名称,名称即为变量名,对应的内存空间中的数据即为变量的值;
变量为什么有类型?
存储空间、存储格式、参与的运算…类型不同决定对数据的处理方式不同
变量命名格式:只能使用字母、数字和下划线;而且不能以数字开头;变量名需做到见名知义;不能使用程序保留字,例如if、case、then、fi、esac、for、while、until、break、continue等;
变量引用:${NAME}, $NAME
变量替换:把变量引用符号出现的位置替换为其指向的内存空间中的数据;
bash变量种类:
本地变量:作用域为当前shell进程;不包括其子进程;
变量赋值:NAME=VALUE
变量引用:$NAME, ${NAME}""
查看变量:set
撤销变量:unset NAME
注意:此处非为变量引用,因此不能使用$;
所有的本地变量在shell进程终止时,会被自动撤销;
环境变量:使用域为当前shell进程及其子进程;
变量声明和赋值:declare -x NAME[=VALUE]
export NAME[=VALUE]
引用方式:${NAME}, $NAME
注意:bash内嵌了许多环境变量,名称为全大写字母,例如UID、HOME、PWD、SHELL, PATH, HISTSIZE等等;
环境变量查看:export, declare -x,env, printenv
撤销环境变量:unset NAME
只读变量:常量
(1) declare -r NAME
(2) readonly NAME
局部变量
位置参数变量
特殊变量
(九)I/O重定向和管道
程序的数据流有三个:
输入数据流: <--,标准输入(stdin),键盘;
输出数据流:-->,标准输出(stdout), 显示器;
错误数据流:-->,错误输出(stderr),显示器;
fd:file descriptor,文件描述符;
stdin: 0
stdout: 1
stderr: 2
IO重定向:
输出重定向:重定向程序正常执行的结果
覆盖重定向:覆盖目标文件中的原有内容;
COMMAND > /PATH/TO/SOMEFILE
追加重定向:追加新产生的内容至目标文件尾部;
COMMAND >> /PATH/TO/SOMEFILE
shell的一个功能开关:
set -C:禁止覆盖输出重定向至已存在的文件;
注意:此时仍然可以使用“>|”至目标文件;
set +C关闭上述特性;
错误重定向:
重定向错误的执行结果;
错误输出覆盖重定向;
COMMAND 2> /PATH/TO/SOMEFILE
错误输出追加重定向;
COMMAND 2>> /PATH/TO/SOMEFILE
合并标准输出与错误输出流:
(1) &>, &>>
(2) COMMAND > /PATH/TO/SOMEFILE 2>&1
COMMAND >> /PATH/TO/SOMEFILE 2>&1
特殊输出目标:/dev/null
位桶:bit bucket
特殊的输入文件:/dev/zero
输入重定向:
COMMAND < /PATH/FROM/SOMEFILE
tr命令:
1.把输出的数据当中的字符,实现对位转换,即把数据中的存在于字符集中的字符,统统转换为字符集2中对应的字符;
tr SET1 SET2 < /PATH/FROM/SOMEFILE
2.删除
tr -d SET1 < /PATH/FROM/SOMEFILE
COMMAND << :Here Document
用法:
COMMAND << EOF
COMMAND > /PATH/TO/SOMEFILE << EOF
管道:
COMMAND1 | COMMAND2 | COMMAND3 | ...
将COMMAND1的结果作为COMMAND2的输入,将COMMAND2的结果作为COMMAND3的输入
tee命令:
tee - read from standard input and write to standard output and files
tee [OPTION]... [FILE]...
-a:使用追加输出,而非覆盖;
COMMAND | tee /PATH/TO/SOMEFILE