一个完整计算机的体系结构包括:硬件与软件,而软件又分为系统软件与应用软件,负责对硬件仅需管理与操作的是系统软件的内核部分,用户是无法与硬件或内核打交道的,用户通过应用程序或部分系统软件发出指令(可能是通过浏览器发送一封邮件),这些指令会被翻译并传给内核,内核在得知用户的需求后调度硬件资源来完成操作(比如,使用网卡发送数据包)。
在Linux环境下,我们一般通过Shell来与内核交流,并最终实现我们想要使用计算机资源的目的。由于Linux的开放性特点,使得在Linux下对Shell的选择也很多,不同的Shell有不同的特点以及操作方式,我们这里了解下Linux技巧之一:Bash特性。
一、bash简介
①shell
bash的起源——shell。shell俗称壳,它是指UNIX系统下的一个命令解析器;主要用于用户和系统的交互。UNIX系统上有很多种Shell。首个shell,即Bourne Shell,于1978年在V7(AT&T的第7版)UNIX上推出。后来,又演变出C shell、bash等不同版本的shell。
广义shell包含:
1、GUI:Gnome、KDE、Xfce
2、CLI:sh,csh,ksh,bash
进程:在每个进程看来,当前主机上只存在内核和当前进程,进程是程序的副本,进程是程序执行实例。
②bashbash,全称为Bourne-Again Shell。它是一个为GNU项目编写的Unix shell。bash脚本功能非常强大,尤其是在处理自动循环或大的任务方面可节省大量的时间。bash是许多Linux平台的内定Shell,这也是我们介绍它主要的原因。
1、支持命令历史、命令补全
2、支持管道、重定向
3、支持命令别名
4、支持命令行编辑
5、支持命令行展开
6、支持文件名通配
7、支持变量
8、支持编程
二、bash的示例和书写流程
1、新建文件test.sh
$ touch test.sh
2、添加可执行权限
$ chmod +x test.sh
3、编辑test.sh,test.sh内容如下:
#!/bin/bash
echo "hello bash"
exit 0
说明:#!/bin/bash : 它是bash文件声明语句,表示是以/bin/bash程序执行该文件。它必须写在文件的第一行!echo "hello bash" : 表示在终端输出“hello bash”exit 0 : 表示返回0。在bash中,0表示执行成功,其他表示失败。4、执行bash脚本
$ ./bash
在终端输出“bash hello”
三、bash特性
1、命令历史:
history:
查看命令历史:history
-c:清空命令历史
-d OFFSET[n]:删除指定位置的命令
例1:history -d 500 #删除第500个历史命令
例2:history -d 500 3 #删除第500个命令起3个历史命令
-w:保存命令历史至历史文件(家目录下.bash_history)中
2、命令历史使用技巧:
!n:执行命令历史中的第N条命令
例:root@localhost /]# !44
!-n:执行命令历史中倒数第N条命令
例:[root@localhost /]# !-44
!!:重新执行上一次命令
!string:执行命令历史中最近一个已指定字符(string)串开头的命令
!$:引用前一个命令的最后一个参数
ESC,.:引用前一个命令的最后一个参数
Alt+.:引用前一个命令的最后一个参数
3、命令别名:
alias CMDALIAS=‘COMMAND [options] [arguments]’
例:[root@localhost /]# alias cls=clear
在shell中定义的别名仅在当前shell生命周期中有效:别名有效范围为当前shell进程
unalias:撤销别名
例:[root@localhost /]# unalias cls
\COMMAND:使用命令本身
4、命令替换:
$(COMMAND)
`COMMAND`:(反引号)
把命令中某个子命令替换为其执行结果的过程
例1:[root@localhost ~]# echo "The current directory is $(pwd)."
The current directory is /root.
例2:[root@localhost ~]# touch ./file-$(date +%F-%H-%M-%S).txt
[root@localhost ~]# ls
anaconda-ks.cfg file-2017-03-30-15-10-30.txt install.log sort.test
Desktop hello install.log.syslog
5、bash支持的引号:
``:命令替换
"":弱引用,可以实现变量替换
‘’:强引用,不完成变量替换
6、文件名通配:globbing
# man 7 glob 可获得以下列表:
*:任意长度的任意字符
?:任意单个字符
[ ]:匹配指定范围内的任意单个字符
[a-z], [A-Z], [0-9], [a-zA-Z]
[[:space:]]:空白字符
[[:punct:]]:标点符号
[[:lower:]]:小写字母
[[:upper:]]:大写字母
[[:alpha:]]:大小写字母
[[:digit:]]:数字
[[:alnum:]]:数字和大小写字母
[^]:匹配指定范围之外的任意单个字符
[^0-9]:非数字
[^[:alpha:]]:非字母
7、环境变量:
PATH:命令搜索路径
HISTSIZE:命令历史缓冲区大小(默认1000条):
例:[root@localhost ~]# echo $HISTSIZE
1000
8、命令行编辑:
Bash准备了大量的快捷键为用户使用,熟练掌握这些快捷键的全部或部分会使你在工作中受益颇多,开始的时候你可能需要花费大量的时间来记忆这些快捷键,但一旦你记住了他们,你的工作效率会直线上升。下面列出了常用的快捷键及其功能描述。
光标跳转:
Ctrl+a:跳到命令行首部
Ctrl+e:跳到命令行尾
Ctrl+f:光标右移一个字符
Ctrl+b:光标左移一个字符
Ctrl+u:删除光标至命令行首的内容
Ctrl+k:删除光标至命令行尾的内容
Ctrl+l:清屏,等同于clear命令
Ctrl+c:终止进程
Ctrl+z:挂起进程(可以通过jobs命令查看挂起的进程)
Ctrl+w:删除光标前一个单词(以空格为分隔符)
Alt+d:删除光标后一个单词
9、命令行展开
在Linux bash中可以使用命令行展开特性一步完成需要分开成多步完成的操作,达到事半功倍的效果。在Linux指令参数位置使用{}将相应的参数括起来,括号中的参数以逗号分隔,然后bash在执行这一指令时会自动将括号中的内容进行展开。
例如:
/tmp/{x,y} #生成/tmp/x和/tmp/y
mkdir {1..10} #生成1-10为名的文件夹
mkdir -p {1..10}/{1..10} #在名为1-10的文件夹里再生成1-10为名的文件夹
总结:
Linux 新手往往对命令行心存畏惧,部分原因是因为需要记忆大量的命令,毕竟掌握命令是高效使用命令行的前提。
不幸的是,学习这些命令并无捷径,然而在你开始学习命令之初,有些工具还是可以帮到你的。“学而时习之,不进则退”,只要不断地学习不断地摸索,你早晚有一天也会成为Linux大牛!
欢迎加入 51软件测试大家庭,在这里你将获得【最新行业资讯】,【免费测试工具安装包】,【软件测试技术干货】,【面试求职技巧】... 51与你共同学习,一起成长!期待你的加入: QQ 群: 755431660