Shell基础知识
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell基础知识相关的知识,希望对你有一定的参考价值。
shell介绍:
shell命令语言解释器,执行命令从标准输入读取或从一个文件中读取。通过用户输入命令,和内核进行沟通!简单点理解就是:用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作。
shell只是系统的一个工具,是系统跟计算机硬件交互时使用的中间介质。实际上,在shell和计算机硬件之间还有一层东西那就是系统内核了。
shell有bash、zsh、ksh等;而centos7默认使用的是Bourne agin shell,也就是bash。
命令历史:
我们敲过的命令,linux是会有记录的,预设可以记录1000条历史命令。这些命令保存在用户的家目录中的.bash_history文件中。有一点需要你知道的是,只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存至.bash_history文件中。
如果你要修改记录的最大值,需要在/etc/profile文件中修改变量HISTSIZE;如果你还想记录输入命令的时间,可以在/etc/profile文件添加HISTTIMEFORMAT="%Y/%m/%d %H:%M:%S "。当然如果你想永久保存所有的命令历史:chattr +a ~/.bash_history
与命令历史有关的特殊字符"!":
!! 表示执行上一个指令;
!n 这里的n是数字,表示执行命令历史中第n条指令,例如 !1002 表示执行命令历史中第1002个命令;
!word (word大于等于1),例如 !pw 表示执行命令历史中最近一次以 ‘pw’ 为开头的指令。
命令补全和别名:
命令补全:使用tab键;按一下tab键是补全命令或路径,按两下tab键是列出所有匹配的命令。若想参数补全的话,需要yum安装bash_completion
alias别名:alias [命令别名]=['具体的命令'];这样可以通过alias把一个常用的并且很长的指令别名一个简洁易记的指令。解除别名命令:unalias [命令别名]。
注意:每个用户都有自己的配置别名文件:~/.bashrc,所以用户自定义的alias应该放在此文件;系统内置的别名一般在/etc/profile.d/目录下。
通配符:
在bash下,可以使用 * 来匹配零个或多个字符,而用 ? 匹配一个字符。还有[0-9]匹配个位数字,{1,2}匹配1和2 等等的使用
输入输出重定向:
输入重定向:< 追加输入重定向:<<
输出重定向:> 追加输出重定向:>>
错误输出重定向:2> 错误追加重定向:2>>
&> 等于 2>&1
管道符和作业控制:
管道符 “|”, 就是把前面的命令运行的结果丢给后面的命令
作业控制:
Ctrl+c 终止任务
Ctrl+z 暂停任务
jobs 可以看到在被暂停或者在后台运行的任务
bg [id] 暂停的任务丢在后台跑起来
fg [id] 把任务调到前台
& 在命令后面加上& 表示直接把任务放到后台执行,它会显示pid信息。
kill pid杀死进程;如果遇到杀不死的进程时,可以在kill 后面加一个选项: kill -9 [pid](需谨慎)
shell变量:
之前介绍过环境变量PATH,这个环境变量就是shell预设的一个变量,通常shell预设的变量都是大写的。还有HOME、PWD、LOGNAME等等。可以输入命令env查看系统预设的全部系统环境变量,你还可以使用set命令把系统预设的全部变量都显示出来。set不仅可以显示系统预设的变量,也可以连同用户自定义的变量显示出来。
要想系统内所有用户登录后都能使用自定义的变量,则修改在配置文件/etc/profile追加,如export mymsql=/usr/local/mysql;修改完配置文件后记得source /etc/profile让配置文件生效噢。
如果只想让当前用户使用该变量,则在用户主目录下的 .bashrc 文件最后一行加入export mysql=/usr/local/mysql 然后运行 source .bashrc 就可以生效了
设置全局变量使用export命令,取消某个变量:unset [变量名]
环境变量配置文件:
几个环境变量配置文件:/etc/profile、/etc/bashrc、~/.bashrc、~/.bash_profile、~/.bash_history、~/.bash_logout
/etc/profile:这个文件预设了几个重要的系统全局变量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE等等
/etc/bashrc:这个文件主要预设umask以及PS1。这个PS1就是我们在敲命令时,前面那串字符:[[email protected] ~]#
~/.bashrc:包含专用于你的shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。例如你可以将用户自定义的alias或者自定义变量写到这个文件中。
~/.bash_profile:定义了用户的个人化路径与环境变量的文件名称。每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。
~/.bash_history:记录命令历史用的。
~/.bash_logout:当退出shell时,会执行该文件。可以把一些清理的工作放到这个文件中。
【当用户执行shell文件时,读取配置文件的顺序为:/etc/profile.d/* --> /etc/profile --> /etc/bashrc --> ~/.bashrc --> ~/.bash_profile --> ~/.bash_logout 】
shell特殊字符:
* 代表零个或多个任意字符
? 只代表一个任意的字符
# 表示注释说明的意思
\ 脱衣字符
| 管道符,它的作用是将符号前面命令的结果丢给符号后面的命令
还有下面这些:
$ 变量前缀,!$组合,正则里面表示行尾
; 多条命令写到一行,用分号分割
~ 用户家目录,后面正则表达式表示匹配符
& 放到命令后面,会把命令丢到后台
> >> 2> 2>> &> 前面提及的输出重定向
[] 指定字符中的一个,[0-9],[a-zA-Z],[abc]
||和&& 用于命令之间作为分隔符;|| 表示或者, && 表示并且
(1)command1 ; command2 不管command1是否执行成功都会执行command2
(2)command1 && command2 只有command1执行成功后,command2才会执行,否则command2不执行
(3)command1 || command2 command1执行成功后command2 不执行,否则去执行command2,总之command1和command2总有一条命令会执行
几个和管道有关的命令:cut、sort、wc、uniq、tee、tr、split
cut:用来截取某一个字段
格式:cut -d '分隔字符' [-cf] n ;这里的n是数字
-d:后面跟分隔字符,分隔字符要用单引号括起来
-c :后面接的是第几个字符
-f :后面接的是第几个区块
示例:
sort:用于排序
格式:sort [-t 分隔符] [-kn1,n2] [-nru] 这里的n1 < n2
-t 分隔符 :作用跟cut的-d一个意思
-n :使用纯数字排序
-r :反向排序
-u :去重复
-kn1,n2 :由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序
示例:
wc:用于统计文档的行数、字符数、词数
常用选项有:
-l :统计行数
-m :统计字符数
-w :统计词数
示例:wc不跟任何选项,直接跟文档,则会把行数、词数、字符数依次输出
uniq:去重复的行
常用的选项只有一个:
-c :统计重复的行数,并把行数写在前面
【使用uniq 的前提是需要先给文件排序,否则不管用。所以经常与sort命令一起使用】
示例:
tee:后跟文件名,类似与重定向 “>”, 但是比重定向多了一个功能,在把文件写入后面所跟的文件中的同时,还显示在屏幕上。
示例:
tr:替换字符,常用来处理文档中出现的特殊符号
常用的选项:
-d :删除某个字符,-d 后面跟要删除的字符
-s :把重复的字符去掉
示例:最常用的就是把小写变大写: tr ‘[a-z]’ ‘[A-Z]’
split:切割文档
常用选项:
-b :依据大小来分割文档,单位为byte
-l :依据行数来分割文档
示例:如果split不指定目标文件名,则会以xaa xab... 这样的文件名来存取切割后的文件。当然我们也可以指定目标文件名123开头
以上是关于Shell基础知识的主要内容,如果未能解决你的问题,请参考以下文章