bash的基础特性
1、命令别名
1、获取当前shell进程的所有可用别名的定义:
# alias
2、定义别名,其相当于执行命令VALUE
# alias NAME='COMMAND'
注意:定义别名仅对当前shell进程有效,如果想永久有效,要定义在配置文件中,配置文件有两种:
1、仅对当前用户有效:~/.bashrc
2、对所有用户有效:/etc/bashrc
注意:编辑配置文件给出的新配置不会立即生效,要打开一个新进程
bash进程重新读取配置文件:
# source /path/to/config_file
# ./path/to/config_file
3、撤销别名
# unalias [-a] name [name ...]
注意:如果别名和原命令相同,如果要执行命令,可使用“\COMMAND”
2、命令历史:history
shell进程会其会话中保存此前用户提交执行过的命令
history是shell的内置命令
1. 命令语法格式:
history [-c] [-d OFFSET] [n]
history -anrw [FILENAME]
history -ps VALUE [VALUE...]
-c: 清空命令历史;
-d offset(偏移量):删除指定命令历史,offset为history显示出来的命令数字
-r: 从文件读取命令历史至历史列表中;
-w:把历史列表中的命令追加至历史文件中;
history #:显示最近的#条命令;
2. 相关环境参数,实现定制环境变量的功能
HISTSIZE:shell进程可保留的命令历史的条数;
HISTFILE:持久保存命令历史的文件,默认为.bash_history
HISTFILESIZE:命令历史文件的存储历史命令数量条数;
HISTCONTROL:控制命令历史记录的方式
ignoredups:忽略重复的命令;
ignorespace:忽略以空白字符开头的命令;
ignoreboth:以上两者同时生效;
3. 调用命令历史列表中的命令
!#:再一次执行历史列表中的第#条命令;
!-#:执行倒数第几条命令;
!!:再一次执行上一条命令;
!STRING:再一次执行命令历史列表中最近一个以STRING开头的命令;
注:命令的重复执行有时候需要依赖于幂等性;
4. 调用上一条命令的最后一个参数:
快捷键:ESC, .
ALT+. 远程终端可能不支持该方法
字符串:!$
5、控制命令历史记录的方式:
环境变量:HISTCONTROL
ignoredups:忽略重复且连续的命令;
ignorespace:忽略以空白字符开头的命令;
ignoreboth:以上两者同时生效;
3、补全特性
1、命令补全:
bash执行命令:内部命令;外部命令——bash根据PATH环境变量定义的路径,自左而右的在每个路径搜寻以给定命令命名的文件,第一次找到的即为要执行的命令。
补全方式:
1、直接补全:Tab键——用户给定的字符串只有一个唯一对应的命令
2、以用户给定的字符串为开头对应的命令不唯一,则再次Tab键
2、路径补全
把用户给出的字符串当做路径的开头,并在其指定的上级目录下搜寻以指定的字符串开头的文件名,如果唯一,则直接补全,反之则再次Tab键,给出列表
3、命令行展开
~:自动展开为用户的家目录,或指定的用户的家目录;
{}:花括号展开。可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;
4、命令执行状态结果特性
1.bash通过状态返回值来输出此结果:
成功:0
失败:1-255
注意:命令正常执行时,有的还会有命令返回值:
根据命令及其功能不同,结果各不相同;
2.状态返回值保存于bash的特殊变量:$?
3.引用命令的执行结果:$(COMMAND) 或 `COMMAND`
5、快捷键
Ctrl+a:跳转至命令行行首
Ctrl+e:跳转至命令行行尾
Ctrl+u:删除行首至光标所在处之间的所有字符;
Ctrl+k:删除光标所在处至行尾的所有字符;
Ctrl+l:清屏,相当于clear
6、文件名通配特性
globbing:文件名通配(整体文件名通配,而非部分)
通配符,匹配模式:元字符(touch):具有特殊意义的专用字符,可以用来规定其前导字符在目标对象的出现模式
- *:匹配任意长度的任意字符
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:]]
7、管道及文本处理工具
1、概念理解:
-
- IO重定向:将执行的结果重新定向输出在别的设备上,可以是文件也可以是其他设备
- 一切皆文件,包括设备都可以作为IO重定向文件
- 在Linux中打开一个文件,在该文件被加载完成后对于系统来说需要用一个数字表示,这个数字叫做fd:file descriptor 文件描述符。因为Linux系统中一切皆文件,所以对应的标准输入设备,标准输出设备,错误输出设备都有其对应的fd
1、标准输入:键盘 keyboard——0
2、标准输出:monitor——1
3、标准错误输出:monitor——2
-
- 数据流:通常描述的信息本质上来说都是数据,因为信息处于动态,我们就将信息或者命令等概念称作流动的数据也就是数据流。在Linux中,程序的数据流有有三种:
1、输入的数据流——标准输入 STDIN 常用设备:键盘
2、输出的数据流——标准输出 STDOUT 常用设备:终端
3、错误输出流——错误输出 STDERR 常用设备:终端
-
- 可用于输入的设备:文件(Linux中一切皆文件):
键盘设备、文件系统上的常规文件、网卡等
-
- 用于输出的设备:文件:
显示器、文件系统上的常规文件、网卡等
2、输出重定向:
-
- > 覆盖输出,目标文件中的原有内容会被消除
- >> 追加输出,新内容会被追加至目标文件尾部
- >| 强行覆盖
注意:使用>不当会对原有的数据造成很大的影响,所以有时候我们会手动设定关闭>的特性。其命令为:
# set -C(只对当前shell进程有效)
禁止覆盖输出重定向至已存在的文件,此时可使用强制覆盖输出:>|;
# set +C
关闭上述特性
3、错误输出流重定向
-
- 2>(错误覆盖)
- 2>>(错误追加)
1、标准输出和错误输出各自定向至不同位置:
COMMAND > /path/to/somefile
COMMAND 2>/path/to/somefile
somefile这个文件可以一开始存在,也可以是被新创建的
2、合并正常输出流和错误输出流为同一个数据流进行重定向:
(1) &>, &>>
(2) COMMAND > /path/to/somefile 2>&1
COMMAND >> /path/to/somefile 2>&1
特殊设备:/dev/null :数据黑洞
4、输入重定向:< / <<
5、管道
定义:组合小程序完成重要任务
连接程序,实现将前一个命令的输出直接定向后一个程序当作输入数据流
格式:
COMMAND1 | COMMAND2 | COMMAND3 | ...
注意:最后一个命令是在当前shell进程的子shell进程中执行
6、tr命令
转换或删除字符串
格式:tr [OPTION]... SET1 [SET2]
把输入的数据当中的字符,凡是在SET1定义范围内出现的,通通对位转换为SET2出现的字符
选项:
-c或——complerment:取字符集的补集
-d或——delete:删除所有属于第一字符集的字符
-s或—squeeze-repeats:把连续重复的字符以单独一个字符表示
7、tee命令
一路输入,两路输出
格式:
命令1 | tee 文件名| 命令2
把命令1的STDOUT保存在文件名中,然后管道输入给命令2
8、命令行展开及bash引用
1、~:自动展开为用户的家目录,或~USERNAME展开为指定的用户的家目录;
2、{}:可承载一个以逗号分隔的路径列表,并能够将其展开为多个路径;
例如:/tmp/{a,b} 相当于 /tmp/a /tmp/b
3、强引用:''
弱引用:""
命令引用:``(ESC键下面的那个键)
9、hash特性
1、hash命令:
当搜某个可执行程序文件时,只会在第一遍搜寻中去遍寻每个文件路径,搜寻出来之后,系统会暂时把这个可执行程序的文件路径缓存在某个空间中,以便下次直接搜寻;shell搜寻到外部命令的路径结果会缓存至kv(key—value)存储中。
1、清除缓存:
如果你搜寻了某个文件之后,在key-value这个格式下,它会缓存在了某个空间中,而当你因为某种原因移动了这个文件的位置后,你再次寻找这个文件时就会出错,这时候就需要清除缓存
#hash -r 清除所有被记忆的缓存
2、
hash:列出
hash -d COMMAND:删除
hash -r:清空
hash -l:既可以看到hash表命令的路径,也可以看到它的名字
3、eg:

上面的hash表会记录下执行命令的次数,以及命令的绝度路径
10、多命令执行控制
1.并行控制:~]# COMMAND1; COMMAND2; COMMAND3; …
执行次序:从左到右,
命令间没有逻辑关系,完成一个之后再进行下一个

2、
2.逻辑控制执行:与&& 、或||、非!
==========状态结果做逻辑运算,给多个命令之间建立执行时的逻辑关系==========
==========控制语句的执行的逻辑能减少语句的运行==========
(1)逻辑运算
1)运算数:真(true, yes, on, 1)
假(false, no, off, 0)
2)与:只有两者为真结果才为真,否则都为假
1 && 1 = 1
1 && 0 = 0
0 && 1 = 0
0 && 0 = 0
3)或:一个为真就为真
1 || 1 = 1
1 || 0 = 1
0 || 1 = 1
0 || 0 = 0
4)非:取反
! 1 = 0
! 0 = 1
(2)短路法则:
1)~]# COMMAND1 && COMMAND2
COMMAND1为“假”,则COMMAND2不会再执行;
否则,COMMAND1为“真”,则COMMAND2必须执行;
2)~]# COMMAND1 || COMMAND2
COMMAND1为“真”,则COMMAND2不会再执行;
否则,COMMAND1为“假”,则COMMAND2必须执行;
示例:~]# id $username || useradd $username
11、bash的配置文件
(1)profile类:为交互式登录的shell进程提供配置
功用:用于定义环境变量;运行命令或脚本;
全局:/etc/profile 、/etc/profile.d/*.sh
用户个人:~/.bash_profile
(2)bashrc类:为非交互式登录的shell进程提供配置
功用:定义本地变量;定义命令别名;
全局:/etc/bashrc
用户个人:~/.bashrc
3.bash路径搜索
交互式登录shell进程:
/etc/profile --> /etc/profile.d/* --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc
非交互式登录shell进程:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*
4.定义生效方法
(1)命令行中定义的特性,例如变量和别名作用域为当前shell进程的生命周期;
(2)配置文件定义的特性,只对随后新启动的shell进程有效;
让通过配置文件定义的特性立即生效:
1) 通过命令行重复定义一次;
2) 让shell进程重读配置文件;
~]# source /PATH/FROM/CONF_FILE
~]# . /PATH/FROM/CONF_FILE

浙公网安备 33010602011771号