linux 基础
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,给出列表。
首当其冲我们首先要讲的是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;
我们之前讲过文件查看类的命令,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:最后一次文件属性修改的时间,包括权限、大小、属性等;
有文件查看工具就有它的管理工具,例如我们复制、移动和删除都是用来管理文件的命令,首先我们说一下复制命令,复制命令的过程很简单,将文件的数据流通过管道传送到一个新的文件中去,原文件保留,移动也就将源文件删除,而数据流则保留到了新的文件中,删除就是将数据从磁盘上移除,但是并不代表磁盘块中没有数据,当新的数据写入时,则那些磁盘块就会自动替换,而块中的源数据则不会在保留;现在我们说一下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。
来源: http://www.bubuko.com/infodetail-2372901.html