2017-10-27Linux基础知识(9)bash基础特性

  在上一章当中我们讲述了FHS、以及一些命令和bash命令历史的特性,FHS是标准的文件系统层级结构,它规定的文件系统的分类存储,使得让各个Linux的发行版本得到的参考和统一,之后我们介绍了一些基本命令,例如:添加别名等,最后我们介绍了Linux文件系统的类型等,那我们接下来继续介绍bash的基础特性,还有一些其它命令。

一、命令补全

  用户在shell界面中(或者叫CLI界面中)输入某个字符,解析为是否是内部命令还是外部命令,如果是外部命令,shell程序就会在指定的文件路径下去查找用户所键入字符相对应,如果字符与该目录文件唯一,则可以用tab键补全,如果不唯一,按一下tab不会显示什么,不过第二下就会显示相应的命令列表来给你进行参考,如果按两下tab没有用的话,即使你回车,shell就会提示你没有这个命令。
  那么来总结一下,shell程序在接收用户执行命令的请求,分析完成之后,最左侧的字符串会被当成命令,而查找的处理机制分为两类,如果是shell内部命令,就查找其shell的内部命令;如果是外部命令,就会根据PATH环境变量中设定的目录,自左而右逐个搜索目录下的文件名。
  当你输入某个命令是,如果是唯一的,按住一次tab就会进行补全,这是因为给定的打头字符如果能唯一标识某命令的程序文件,则直接补全,不能唯一标识某命令的程序文件,则在击tab键一次,给出相应的列表供你选择。
  所以命令补全是在给定的起始路径下,以对应路径下的打头字符串逐一匹配起始路径下的每个文件;如果能唯一标识,则直接补全,否则,再一次tab,给出列表。

1.1 目录管理类的命令

  首当其冲我们首先要讲的是mkdir和rmdir这两个命令,那么顾名思义,就是创建和删除目录,在Windows中我们创建目录的话,直接右键->新建->文件夹,在Linux中我们则使用mkdir命令在创建目录,其命令格式为:

  # mkdir [OPTION]... DIRECTORY...

  常用的选项有以下几种:

  -p:自动按需创建父目录;
  -v:verbose, 显示详细过程;
  -m MODE:直接给定权限;

  需要注意的是:路径的基名方为命令的作用对象;基名之前的路径必须得存在;起始基名就是最后一个名称。
  接下来说的是删除目录命令,删除目录命令为rmdir,如果前提是该目录是一个空目录才能删除,里面要是有文件或目录的话,我们可以批量删除,命令的用法也是与创建目录的用法相同:

  # rmdir [OPTION]... DIRECTORY...

  选项如下:

  -p:删除某个目录后,如果其父目录为空,并一并删除之;
  -v:显示过程;

  现在有以下两个问题:
  1、如何创建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/a, /tmp/x/y1/b?
  2、如何创建a_c, a_d, b_c, b_d?

二、命令行展开

  命令行展开无非有一下几类:一类是家目录的,一类是{},之前我们也讲过在命令提示符当中~代表着当前的家目录或自动展开为用户的家目录,而{}是可承载一个以逗号的路径列表,并能够将其展开为多个路径,以下可示例:

 例如:/tmp/{a,b},相当于:/tmp/a, /tmp/b

  好的以上就是命令行的展开,那么前两题的答案如下:

  # mkdir -pv x/{y1/{a,b},y2}
  # mkdir -pv {a,b}_{c,d}

  现在有个问题3:创建如下结构:

    /tmp/mysysroot/
	bin
	sbin
	etc
	    sysconfig
		network-scripts
	usr
	    bin
	    sbin
	    local
		bin
		sbin
		etc
		lib
	lib
            lib64
        var
	    cache
	    log
	    run

  答案:

  # mkdir -pv /tmp/sysroot/{bin,sbin,etc/sysconfig/network-scripts,usr/{bin,sbin,local/{bin,sbin,etc,lib}},lib/lib64,var/{cache,log,run}}

  我们可以用tree命令查看一下,需要注意的是,在Linux系统当中,可能是没有这条命令,我们可以使用yum命令安装,至于yum命令的用法,我们随后讲系统管理时再次说明。

  # yum -y install tree

  命令用法:

  # tree [options] [directory]
	-L level:指定要显示的层级;
  # tree /tmp/sysroot/
  /tmp/sysroot/
  |-- bin
  |-- etc
  |   `-- sysconfig
  |       `-- network-scripts
  |-- lib
  |   `-- lib64
  |-- sbin
  |-- usr
  |   |-- bin
  |   |-- local
  |   |   |-- bin
  |   |   |-- etc
  |   |   |-- lib
  |   |   `-- sbin
  |   `-- sbin
  `-- var
      |-- cache
      |-- log
      `-- run

  19 directories, 0 files

三、命令的执行状态结果

  我们在shell当中输入某个命令时,如果执行对了就会显示其相应的结果,命令输错也有相应的提示,而每个命令的结果其实都有它的返回值的,其结果也无非是正确和错误,那么bash就是通过执行状态的返回值来输出此结果,成功就是0,失败的范围数很大,从1到255,当你的命令执行完成之后,其状态返回值保存于bash的特殊变量$?中。

  # ls
  anaconda-ks.cfg  fstab  functions  lover.txt  shell_scripts
  # echo "$?"
  0
  # lss
  -bash: lss: command not found
  # $?
  -bash: 127: command not found

  还有,当命令正常执行时,有的还回命令结果的返回值;根据命令及其功能的不同,结果也各不相同。
  我们还可以引用命令的执行结果,有以下两种方式:

  $(COMMAND)或`COMMAND`
  # mkdir `date +"%F_%T"`
  # ll
  drwxr-xr-x. 2 root root     6 Oct 29 11:13 2017-10-29_11:13:15

四、引用

  我们可使用单引号和双引号来引用变量和语句等,差别就是一个是强引用,后者为弱引用,强引用是无论你是不是变量,都给你原样显示,不显示变量结果,只显示变量名称,弱引用与强引用不同的是,弱引用是能显示变量结果的,示例如下:

  # echo '$PATH'
  $PATH
  # echo "$PATH"
  /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

  还有一种是命令引用,这个在上面我们讲过,此处略。

五、快捷键

  我们在Windows中会知道各种各样的快捷键,最简单的也无非就是复制(Ctrl+c)和粘贴(Ctrl+v)了,在Linux也有其相应的快捷键,我们使用快捷键可以更好的处理Linux上的命令:

  Ctrl+a:跳转至命令行行首;
  Ctrl+e:跳转至命令行行尾;
  Ctrl+u:删除行首光标所在处之间的所有字符;
  Ctrl+k:删除光标所在处至行尾的所有字符;
  Ctrl+l:清屏,相当于clear;

5.1 文件查看类命令

  我们之前讲过文件查看类的命令,cat和tac前者是正序,后者是倒序查看,这是两个基本的命令,但是这两个命令直接就显示到底部,并没有一个查看过程,所以more命令和less命令就是将这个查看过程给显示出来,这两个的命令格式也是很简单的:

  # more FILE

  more命令有个特点:翻屏至文件尾部之后会自动退出;

  # less FILE

  另一个文件查看类命令为head和tail,不一样的是前者的命令查看前n行,而后者的命令查看倒数n行,格式如下:

  # head [options] FILE

  选项:

  -n # 
  -#

  head默认不加选项的话,只是显示前10行默认,tail命令也是,显示为后10行;

  # tail [options] FILE

  选项:

  -n #
  -#
  -f:查看文件尾部内容结束后不退出,跟随显示新增的行;

  接下来说一下stat命令,stat命令无疑是显示文件或文件系统状态,命令格式为

  # stat FILE...

  如果查看某个文件状态,就会看到一下结果,我们举例来演示一下:

  # stat anaconda-ks.cfg 
    File: ‘anaconda-ks.cfg’
    Size: 1612      	Blocks: 8          IO Block: 4096   regular file
  Device: 803h/2051d	Inode: 50824939    Links: 1
  Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
  Context: system_u:object_r:admin_home_t:s0
  Access: 2017-10-03 22:18:51.777786103 +0800
  Modify: 2017-10-03 22:18:51.794786340 +0800
  Change: 2017-10-03 22:18:51.794786340 +0800

  我们主要讲的是倒数后三行,前几行我们很容易理解。如上所示,会出现三个类型的时间,分别是访问时间、修改时间和更改时间。

  Access time:表示最后一次访问(仅仅是访问,没有改动)文件的时间;
  Modify time:最后一次修改文件的时间;
  Change time:最后一次文件属性修改的时间,包括权限、大小、属性等;

5.2 文件管理工具

  有文件查看工具就有它的管理工具,例如我们复制、移动和删除都是用来管理文件的命令,首先我们说一下复制命令,复制命令的过程很简单,将文件的数据流通过管道传送到一个新的文件中去,原文件保留,移动也就将源文件删除,而数据流则保留到了新的文件中,删除就是将数据从磁盘上移除,但是并不代表磁盘块中没有数据,当新的数据写入时,则那些磁盘块就会自动替换,而块中的源数据则不会在保留;现在我们说一下cp命令。
  cp命令无非就是复制命令,从源文件产生目标文件的一个过程,有单源复制和多源复制这两大选项,命令格式为:

  单源复制:# cp [OPTIONS]... [-T] SOURCE REST
  多源复制:# cp [OPTIONS]... SOURCE... DIRECTORY
	  # cp [OPTIONS]... -t DIRECTORY SOURCE...

  我们先来说一下单源复制,单源复制:如果DEST不存在:则事先创建此文件,并复制源文件的数据流至DEST中,但如果DEST存在,那就得往两方面考虑,一种是如果DEST是非目录文件:则覆盖其目标文件;另一种是如果DEST是目录文件:则现在DEST目录下先创建一个与源文件同名的文件,并复制其数据流。

  单源复制:# cp [OPTIONS]... [-T] SOURCE REST

  另一种是多源复制,就是将多个文件复制到一个地方去,如果说DEST不存在有两个选项,第一个就是如果DEST是非目录文件:则直接错误;但如果DEST是目录文件:则分别复制每个文件至目标目录中,并保持原名。
  cp的常用选项如下:

  -i:交互式复制,即覆盖之前提醒用户确认;
  -f:强制覆盖目标文件;
  -r:递归复制目录;
  -d:复制符号链接本身,而非指向其源文件;
  -a: ---preserve=all, archive, 用于实现归档;
  --preserv=
	mode:权限
	ownership:属主和属组
	timestamps:时间戳
	context:安全标签
	xattr:扩展属性
	links:符号链接
	all:上述所有属性

  那么关于移动的命令为mv命令,使用命令的格式也是和cp命令差不多,大致格式为:

 mv [OPTION]... [-T] SOURCE DEST
 mv [OPTION]... SOURCE... DIRECTORY
 mv [OPTION]... -t DIRECTORY SOURCE...

  常用选项:

  -i:交互式;
  -f:force

  接下来就是删除命令了,rm命令就是清除命令,这个命令是非常危险的,弄不好的话可以将系统删除,简直就是灰飞烟灭,而且这个删除命令,是不可逆操作的,请慎用这个命令,其命令格式如下:

  # rm [OPTIONS]... FILE...

  常用选项:

  -i:interactive
  -f:force
  -r:recursive

  如果你想强制删除某个目录,就用以下格式:

  # rm -rf /PATH/TO/DIR

  其中最危险的操作:

  # rm -rf /*

  危险的命令推荐使用一下,体验它的严重性,这样保证在生产环境中就会谨慎。需要注意的是:所有不用的文件建议不要直接删除,而是移动某个专用目录。(模拟回收站)

六、变量

  变量其实是一个很大的话题,这里就简单说一下,变量就是在内存当中申请一块空间用来存放数据,用变量名称来标识其该变量的内存地址,命名的内存空间;变量类型有很多,大致分为字符型、数值型等,我们以字符型为例,分为精确数值和近似数值。使用变量我们一定要考虑它的存储格式、数据范围和参与运算的性质,那么变量的复制操作为:name=var。