一个完整计算机的体系结构包括:硬件与软件,而软件又分为系统软件与应用软件,负责对硬件仅需管理与操作的是系统软件的内核部分,用户是无法与硬件或内核打交道的,用户通过应用程序或部分系统软件发出指令(可能是通过浏览器发送一封邮件),这些指令会被翻译并传给内核,内核在得知用户的需求后调度硬件资源来完成操作(比如,使用网卡发送数据包)。


在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