学习shell我个人认为应该先打好基础,基础知识扎实,学起来就轻松些。
前言:
Shell是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具,说的形象一些,计算机硬件就相当于人的躯干,计算机内核相当于人的大脑,而shell就相当于人的五官。用户把指令告诉给shell,shell再传输给系统内核,内核再去支配计算机硬件去执行各种操作。
一、关于shell
1、记录命令历史:
!!:表示执行上一条指令。
!n:n指的是数字,表示执行命令历史中的第几条指令。
例:
!字符串(字符串大于等于1):例如!pw表示命令历史中最近一次pw开头的命令。
2、命令和文件名补全:
tab键可以帮我们补全一个指令,连续按两次系统则会把所有的命令或者文件名都列出来。
3、别名:
我们可以通过alias把一个常用的并且很长的指令取名为一个简单易记的指令,如果不想用还可以使用unalias命令解除别名功能。
我们还可以自定义命令的别名,格式为alias【命令别名】=【‘具体的命令’】,如下图所示:
4、通配符:
在bash下,可以使用*来匹配零个或多个字符,用?匹配一个字符。
5、输入/输出重定向:
输入重定向用于改变命令的输入(符号为<),输出重定向用于改变命令的输出(符号为>),以及错误重定向2>,以及追加重定向>>。
6、管道符:
|,它用于将前一个指令的输出作为后一个指令的输入。
例:cat /etc/passwd |wc -l
7、作业控制:
Ctrl+z: 暂停,fg恢复它,bg使它后台运行。
Ctrl+c:停止,jobs可以看到当前被暂停或在后台运行的任务。
当多个任务被暂停的时候会有编号,再使用bg或fg的时候要在后面加编号。
vmstat是用来观察系统状态的一个命令。
使用&把任务放到后台运行时,会显示pid信息,如果忘记这个pid,还可以使用ps aux 找到那个进程,用kill + pid即可结束该进程。
二、变量
1、命令env:
可列出系统预设的全部系统变量,显示的变量只是环境变量。
HOSTNAME:表示主机的名称。
SHELL: 表示当前用户的shell类型。
HISTSIZE: 表示历史记录数。
MAIL: 表示当前用户的邮件存放目录。
PATH: 该变量绝定了shell将到哪些目录中寻找命令或程序。
PWD:表示当前目录。
LANG: 这是与语言相关的环境变量,多语言环境可以修改此环境变量。
HOME: 表示当前用户的家目录。
LOGNAME: 表示当前用户的登录名。
2、命令set:
set命令与env命令类似,也可以输出环境变量,如下图所示:
set还可以显示用户自定义的变量,但是改变量只能在shell中生效, 如下图所示:
bash表示再打开一个子shell,此时先前设的myname变量已经没了,退出当前shell回到原来的shell发现变量还在。
允许系统内所有用户登录后都能使用该变量,如下图所示:
这里的source命令的作用是将目前设定的配置刷新。
3、在Linux下设置自定义变量,有以下规定:
(1)设定变量的格式为a=b,其中a为变量名,b为变量的内容,等号两边不能有空格。
(2)变量名只能由字母、数字以及下划线组成,而且不能以数字开头。
(3)当变量内容带有特殊字符(如空格)时,需要加上单引号,比如:myname=‘Aming Li’。
(4)当变量本身带有单引号,这时就要加双引号了,例如:myname=”Aming’s”。
(5)如果变量内容中需要得到其他命令,运行结果可以使用反引号,例:myname=`pwd`。
(6)变量内容可以累加其他变量内容,但需要加双引号,例:myname=“$LOGNAME”Aming。
(7)pstree:把系统中的所有进程以树形结构显示出来。
#yum install -y psmisc下载该命令。
在父shell中设定变量后,进入子shell时,改变量是不会生效的,如下图所示:
如果想让这个变量在子shell中生效,则要用到export指令,如果想取消输入unset + 变量名即可,如下图所示:
4、系统环境变量与个人环境变量的配置文件:
(1)/etc/profile: 这个文件预设了几个重要的变量,例如:PATH、USER、LOGNAME、MAIL、INPUTRC、HOSTNAME、HISTSIZE、umask等。
(2)/etc/bashrc: 这个文件主要预设umask以及PS1。
这里,\u指用户,\h指主机名,\w指当前目录,\$指字符#(如果是普通用户,则显示为$)。
(3).bash_profile: 该文件定义了用户的个人化路径与环境变量的文件名称。
(4).bashrc:该文件包含专属于自己的shell的bash信息,当登录或每次打开新的shell时,该文件会被读取。
(5).bash_history: 该文件用于记录命令历史。
(6).bash_logout: 当退出shell时,会执行该文件。
5、Linux shell中的特殊符号:
(1)*代表零个或多个任意字符
(2)?只代表一个任意的字符
(3)注释符号#,即该符号后面的内容都会被忽略,
用法如下:
(4)脱义字符\:这个字符会将后面的特殊字符(如*)还原为普通字符,
用法如下:
(5)再说管道符 | :它的作用是将前面命令的输出作为后面命令的输入。
1、命令cut:格式为cut -d ‘分隔字符’【-cf】n,这里n指数字。
该命令有几个选项:
-d:后面跟分隔字符,分隔字符要用单引号括起来。
-c:后面接的是第几个字符。
-f:后面接的是第几个区块。
命令用法如下图所示:
-f和1之间空格可有可无,例:# head -n2 /etc/passwd|cut -c2
-c后面可以是一个数字,也可以是一个区间n1~n5,还可以多个数字,n1,n2、n3,如下图所示:
2、命令sort:用作排序,格式为sort 【-t分隔符】【-kn1,n2】【-nru】,这里n1,n2指的是数字,其它的选项如下:
-t:后面跟分隔字符,作用跟cut的-d一样。
-n:表示单纯用数字排序。
-r:表示反向排序。
-u:表示去重复。
-kn1,n2:表示由n1区间排序到n2区间,可以只写kn1,即对n1字段排序。
3、wc:用于统计文档的行数、字符数或词数,该命令常用的选项有-l(统计行数)、-m(统计字符数)、-w(统计词数)。
如下图所示:
4、uniq:用来删除重复的行,-c选项比较常用,它统计重复的行数,并把行数写在前面。使用uniq之前必须先给文件排序,如下图所示:
5、命令tee:作用类似于重定向(>),但是它还能把文件写入后面所跟文件时,还显示在屏幕上。
6、命令tr:用于替换字符,常用的命令有两个:
-d:表示删除某个字符,后面跟要删除的字符。
-s:表示删除重复的字符。
常常用来把小写字母变成大写字母,用法如下图:
7、命令split:用于切割文档,常用选项为-b和-l:
-b:表示一句大小来分割文档,单位为byte。
-l:表示依据行数来分割文档。
8、特殊符号$:可以用作变量前面的标识符,还可以和!结合起来使用,!$表示上条命令中的最后一个变量,用法如下图所示:
9、特殊符号 ; :如果想在一行中运行两个或两个以上的命令,需要加;
10、特殊符号~:代表用户的家目录,root用户的家目录是/root,普通用户则是/home/username。
11、特殊符号&:如果想把一条命令放到后台执行,需要加上&。
12、重定向符号>、>>、2>和2>>:>和>>分别表示取代和追加的意思,2>和2>>分别表示错误定向和错误追加重定向。
13、中括号[ ]:中括号内为字符组合,代表字符组合中的任意一个,也可以是一个范围(1-3,a-z),用法如下:
14、特殊符号&&和||:
(1)command1 ;command2
(2)command1 && command2
(3)command1 || command2
使用;时,不管command1是否执行成功,都会执行command2
使用&&时,只有前者执行成功,才会执行后者。
使用||时,前者执行成功后则后者不执行,否则执行command2。
具体操作如下图: