到目前为止,我们已经学了不少的命令了,对linux系统也有了初步的理解。接下来将为大家介绍bash的一些特性。(本节至关重要)
1、环境变量特性
bash shell通过一个名为环境变量的特性来存储相关的工作环境信息。系统本身会自带一些环境变量,我们也可以自定义变量。在bash shell中,环境变量可以分为全局变量和局部变量。
全局变量和局部变量的区别可能要在理解了父子进程之后才便于演示与说明,在此暂不多说,读者对环境变量有一个感性的认识即可。
我们列举一些在bash中常见的环境变量来帮助你理解环境变量。在此之前,我们再来了解一下echo这个命令。
echo命令常常用于回显,他可以回显你指定的字符串或者变量。
需要引用变量值的时候,要在变量前加上$符号。
我们也可以引用变量的输出结果。使用$(COMMAND) 或`COMMAND`
echo [SHORT-OPTION]... [STRING]...
-n:不进行换行;
-e:让转义符生效;
\n:换行
\t:制表符
STRING可以使用引号,单引号和双引号均可用;
单引号:强引用,变量引用不执行替换;
双引号:弱引用,变量引用会被替换;
如,我设置一个变量为first_variable,并演示一下强弱引用的区别。最后演示了引用命令结果的示例
[root@localhost ~]# first_variable=hello
[root@localhost ~]# echo"$first_variable"
hello
[root@localhost ~]# echo '$first_variable'
$first_variable
[root@localhost ~]#
我们之前介绍过,每一个外部命令都有一个对应的二进制文件,我们执行命令的时候就是在执行这个二进制文件。那么系统如何知道到哪里去寻找这个二进制文件呢,在此时,环境变量PATH就发挥了作用。系统会根据PATH中的路径从左到右依次寻找你索要执行的命令文件。
[root@localhost ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
常见的环境变量还有很多(printenv命令可以打印出当前全部的环境变量内容),后续遇到会为大家介绍
2、命令历史特性
shell进程会保存用户执行过的命令;最直观的现象就是你用上下键可以回滚出你以前执行过的命令。
history的工作特性:
当我们登录用户之后,系统会从主用户主文件夹中的~/.bash_history文件去读取过去曾经下达的命令,该文件记录的历史命令条数与环境变量HISTFILESIZE有关。
~/.bash_history文件在用户登出时进行更新,如果历史命令条数大于HISTFILESIZE,保留最新加入的历史,删除最旧的几条历史命令,使得条目维持在HISTFILESIZE。
命令用法:
history [n]
n表示数字,表示显示最近的n条记录
history [options] [file]
-c: 清空命令历史;
-d offset:删除指定命令历史
-r: 从~/.bash_history读取记录到当前shell的history列表中;
-w:把历史列表中的命令追加至历史文件中(~/.bash_history);
命令历史产生了一些快捷用法:
!$ 调用上一条命令的最后一个参数
!STRING 再一次执行命令历史列表中最近一个以STRING开头的命令
如:
[root@localhost~]# echo "下次就不用写那么长一句话了"
下次就不用写那么长一句话了
[root@localhost~]# echo !$
echo"下次就不用写那么长一句话了"
下次就不用写那么长一句话了
[root@localhost ~]# !e
echo "下次就不用写那么长一句话了"
下次就不用写那么长一句话了
我们之前提到过,有一个环境变量HISTFILESIZE是用来控制历史条目数量的,另外还有一个相关的环境变量HISTCONTROL则是实现对历史命令的记录方式进行控制的。
[root@localhost ~]# echo $HISTFILESIZE
1000
[root@localhost~]# echo $HISTCONTROL
ignoredups
关于HISTCONTROL,对应值的效果如下
ignoredups:忽略重复的命令;
ignorespace:忽略以空白字符开头的命令;
ignoreboth:以上两者同时生效;
现在HISTCONTROL的值是忽略重复命令,我们把它改成ignoreboth,看看效果:
[root@localhost ~]# history -c
[root@localhost ~]# HISTCONTROL=ignoreboth
[root@localhost ~]# echo $HISTCONTROL
ignoreboth
[root@localhost ~]# echo "test 1"
test 1
[root@localhost ~]# echo "begin with white space"
begin with white space
[root@localhost ~]# history
1 HISTCONTROL=ignoreboth
2 echo $HISTCONTROL
3 echo "test 1"
4 history
[root@localhost ~]#
可以看到,以空格为开头的echo "begin with white space"没有被记录。当你不想自己的某些命令历史被他人得知时可以使用此技巧哦。
3、命令补全特性
命令补全:
shell程序在接收到用户执行命令的请求,分析完成之后,最左侧的字符串会被当作命令; 给定的打头字符串如果能惟一标识某命令程序文件,则直接补全;
不能惟一标识某命令程序文件的时候,双击tab,会给出列表;
4、命令执行后具有状态结果
每一个命令执行后,都会具有一个返回值,环境变量$?记录了上一条命令的返回值。命令执行成功会返回0,执行不成功返回1-255.
该特性时长用于bash脚本编程中
举例:
第一条命令执行成功了,返回0,后面的两条,执行失败了,返回了非0的返回值
[root@localhost~]# echo "successful"
successful
[root@localhost~]# echo "$?"
0
[root@localhost~]# cd /nofile
-bash:cd: /nofile: No such file or directory
[root@localhost~]# echo "$?"
1
[root@localhost ~]#
[root@localhost ~]# dddd
-bash: dddd: command not found
[root@localhost ~]# echo "$?"
127
5、bash中的一些快捷键
Ctrl+a:跳转至命令行行首
Ctrl+e:跳转至命令行行尾
Ctrl+u:删除行首至光标所在处之间的所有字符;
Ctrl+k:删除光标所在处至行尾的所有字符;
Ctrl+l:清屏,相当于clear
本节的内容先到这里,下一节继续为大家介绍bash的基础特性:通配符、管道、重定向。