学习 shell脚本之前的基础知识

见 : http://www.92csz.com/study/linux/12.htm


什么是shell】

简单点理解,就是系统跟计算机硬件交互时使用的中间介质,它只是系统的一个工具实际上,在shell和计算机硬件之间还有一层东西那就是系统内核了打个比方,如果把计算机硬件比作一个人的躯体,而系统内核则是人的大脑,至于shell,把它比作人的五官似乎更加贴切些回到计算机上来,用户直接面对的不是计算机硬件而是shell,用户把指令告诉shell,然后shell再传输给系统内核,接着内核再去支配计算机硬件去执行各种操作

笔者接触的linux发布版本(Redhat/CentOS)系统默认安装的shell叫做bash,即Bourne Again Shell,它是shBourne Shell)的增强版本。Bourn Shell 是最早行起来的一个shell,创始人叫Steven Bourne,为了纪念他所以叫做Bourn Shell,检称sh。那么这个bash有什么特点呢?

1)记录命令历史

我们敲过的命令,linux是会有记录的,预设可以记录1000条历史命令这些命令保存在用户的家目录中的.bash_history文件中有一点需要你知道的是,只有当用户正常退出当前shell时,在当前shell中运行的命令才会保存至.bash_history文件中

与命令历史有关的有一个有意思的字符那就是”!”常用的有这么几个应用:(1!! (连续两个”!”),表示执行上一条指令;(2!n(这里的n是数字),表示执行命令历史中第n条指令,例如”!100”表示执行命令历史中第100个命令;(3!字符串(字符串大于等于1),例如!ta,表示执行命令历史中最近一次以ta为开头的指令

[image]

2)指令和文件名补全

在本教程最开始笔者就介绍过这个功能了,记得吗?对了就是按tab键,它可以帮你补全一个指令,也可以帮你补全一个路径或者一个文件名连续按两次tab键,系统则会把所有的指令或者文件名都列出来

3)别名

前面也出现过alias的介绍,这个就是bash所特有的功能之一了我们可以通过alias把一个常用的并且很长的指令别名一个简洁易记的指令如果不想用了,还可以用unalias解除别名功能直接敲alias会看到目前系统预设的alias 

[image]

看到了吧,系统预设的
alias指令也就这几个而已,你也可以自定义你想要的指令别名。alias语法很简单,alias [命令别名]=[’具体的命令’]。

4)通配符

bash下,可以使用*来匹配零个或多个字符,而用?匹配一个字符

[image]

5)输入输出从定向

输入重定向用于改变命令的输入,输出重定向用于改变命令的输出输出重定向更为常用,它经常用于将命令的结果输入到文件中,而不是屏幕上输入重定向的命令是<,输出重定向的命令是>,另外还有错误重定向2>,以及追加重定向>>,稍后会详细介绍

6)管道符

前面已经提过过管道符”|”,就是把前面的命令运行的结果丢给后面的命令

7)作业控制

当运行一个进程时,你可以使它暂停(按Ctrl+z),然后使用fg命令恢复它,利用bg命令使他到后台运行,你也可以使它终止(按Ctrl+c

变量

前面章节中笔者曾经介绍过环境变量PATH,这个环境变量就是shell预设的一个变量,通常shell预设的变量都是大写的变量,说简单点就是使用一个较简单的字符串来替代某些具有特殊意义的设定以及数据就拿PATH来讲,这个PATH就代替了所有常用命令的绝对路径的设定因为有了PATH这个变量,所以我们运行某个命令时不再去输入全局路径,直接敲命令名即可你可以使用echo命令显示变量的值

[image]

除了PATH, HOME, LOGNAME外,系统预设的环境变量还有哪些呢?

[image]

使用env命令即可全部列出系统预设的全部系统变量了不过登录的用户不一样这些环境变量的值也不一样当前显示的就是root这个账户的环境变量了下面笔者简单介绍一下常见的环境变量:

PATH 决定了shell将到哪些目录中寻找命令或程序

HOME 当前用户主目录

HISTSIZE 历史记录数

LOGNAME 当前用户的登录名

HOSTNAME 指主机的名称

SHELL 前用户Shell类型

LANG 语言相关的环境变量,多语言可以修改此环境变量

MAIL 当前用户的邮件存放目录

PWD 当前目录

env命令显示的变量只是环境变量,系统预设的变量其实还有很多,你可以使用set命令把系统预设的全部变量都显示出来

[image]

限于篇幅,笔者在上例中并没有把所有显示结果都截图。set不仅可以显示系统预设的变量,也可以连同用户自定义的变量显示出来用户自定义变量?是的,用户自己同样可以定义变量

[image]

虽然你可以自定义变量,但是该变量只能在当前shell中生效,不信你再登录一个shell试试?

[image]

使用bash命令即可再打开一个shell,此时先前设置的myname变量已经不存在了,退出当前shell回到原来的shellmyname变量还在那要想设置的变量一直生效怎么办?有两种情况:

1 要想系统内所有用户登录后都能使用该变量

需要在/etc/profile文件最末行加入 “export myname=Aming” 然后运行”source /etc/profile”就可以生效了此时你再运行bash命令或者直接su - test账户看看

[image]

2)只想让当前用户使用该变量

需要在用户主目录下的.bashrc文件最后一行加入“export myname=Aming” 然后运行”source .bashrc”就可以生效了这时候再登录test账户,myname变量则不会生效了上面用的source命令的作用是,讲目前设定的配置刷新,即不用注销再登录也能生效

笔者在上例中使用”myname=Aming”来设置变量myname,那么在linux下设置自定义变量有哪些规则呢?

a. 设定变量的格式为”a=b”,其中a为变量名,b为变量的内容,等号两边不能有空格;

b. 变量名只能由英数字以及下划线组成,而且不能以数字开头;

c. 当变量内容带有特殊字符(如空格)时,需要加上单引号;

[image]

有一种情况,需要你注意,就是变量内容中本身带有单引号,这就需要用到双引号了

[image]

d. 如果变量内容中需要用到其他命令运行结果则可以使用反引号;

[image]

e. 变量内容可以累加其他变量的内容,需要加双引号;

[image]

在这里如果你不小心把双引号加错为单引号,将得不到你想要的结果

[image]

通过上面几个例子也许你能看得出,单引号和双引号的区别:用双引号时不会取消掉里面出现的特殊字符的本身作用(这里的$),而使用单引号则里面的特殊字符全部失去它本身的作用

在前面的例子中笔者多次使用了bash命令,如果在当前shell中运行bash指令后,则会进入一个新的shell,这个shell就是原来shell的子shell了,不妨你用pstree指令来查看一下

[image]

pstree这个指令会把linux系统中所有进程通过树形结构打印出来限于篇幅笔者没有全部列出,你可以直接输入pstree查看即可在父shell中设定一个变量后,进入子shell后该变量是不会生效的,如果想让这个变量在子shell中生效则要用到export指令,笔者曾经在前面用过

[image]

export其实就是声明一下这个变量的意思,让该shell的子shell也知道变量abc的值是123.如果export后面不加任何变量名,则它会声明所有的变量

[image]

在最后面连同我们自定义的变量都被声明了

前面光讲如何设置变量,如果想取消某个变量怎么办?只要输入”unset 变量名即可

[image]

unset abc后,再echo $abc则不再输出任何内容

系统环境变量与个人环境变量的配置文件

上面讲了很多系统的变量,那么在linux系统中,这些变量被存到了哪里呢,为什么用户一登陆shell就自动有了这些变量呢?

/etc/profile :这个文件预设了几个重要的变量,例如PATH, USER, LOGNAME, MAIL, INPUTRC, HOSTNAME, HISTSIZE, umas等等

/etc/bashrc :这个文件主要预设umask以及PS1。这个PS1就是我们在敲命令时,前面那串字符了,例如笔者的linux系统PS1就是 [root@localhost ~]# ,你不妨看一下PS1的值

[image]

\u就是用户,\h 主机名, \W 则是当前目录,\$就是那个’#’了,如果是普通用户则显示为’$’

除了两个系统级别的配置文件外,每个用户的主目录下还有几个这样的隐藏文件:

.bash_profile :定义了用户的个人化路径与环境变量的文件名称每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次

.bashrc :该文件包含专用于你的shellbash信息,当登录时以及每次打开新的shell,该该文件被读取例如你可以将用户自定义的alias或者自定义变量写到这个文件中

.bash_history :记录命令历史用的

.bash_logout :当退出shell时,会执行该文件可以把一些清理的工作放到这个文件中

 

linux shell中的特殊符号

你在学习linux的过程中,也许你已经接触过某个特殊符号,例如”*”,它是一个通配符号,代表零个或多个字符或数字下面笔者就说一说常用到的特殊字符

1. * :代表零个或多个字符或数字

[image]

test后面可以没有任何字符,也可以有多个字符,总之有或没有都能匹配出来

2. ? :只代表一个任意的字符

[image]

不管是数字还是字母,只要是一个都能匹配出来

3. # :这个符号在linux中表示注释说明的意思,即”#”后面的内容linux忽略掉

[image]

在命令的开头或者中间插入”#” linux都会忽略掉的这个符号在shell脚本中用的很多

4. \ :脱意字符,将后面的特殊符号(例如”*” )还原为普通字符

[image]

5. | :管道符,前面多次说过,它的作用在于将符号前面命令的结果丢给符号后面的命令这里提到的后面的命令,并不是所有的命令都可以的,一般针对文档操作的命令比较常用,例如cat, less, head, tail, grep, cut, sort, wc, uniq, tee, tr, split, sed, awk等等,其中grep, sed, awk为正则表达式必须掌握的工具,在后续内容中详细介绍

6. $ :除了用于变量前面的标识符外,还有一个妙用,就是和’!’结合起来使用

[image]

‘!$’表示上条命中中最后一个变量(也许称为变量不合适,总之就是上条命令中最后出现的那个东西)例如上边命令最后是test.txt那么在当前命令下输入!$则代表test.txt。

1grep :过滤一个或多个字符,将会在后续内容中详细介绍其用法

[image]

2) cut :截取某一个字段

语法:cut -d “分隔字符” [-cf] n 这里的n是数字

-d :后面跟分隔字符,分隔字符要用双引号括起来

-c :后面接的是第几个字符

-f :后面接的是第几个区块

[image]

-d 后面跟分隔字符,这里使用冒号作为分割字符,-f 1 就是截取第一段,-f1之间的空格可有可无

[image]

-c 后面可以是1个数字n,也可以是一个区间n1-n2,还可以是多个数字n1,n2,n3

[image]

3) sort :用做排序

语法:sort [-t 分隔符] [-kn1,n2] [-nru] 这里的n1 < n2

-t 分隔符 :作用跟cut-d一个意思

-n :使用纯数字排序

-r :反向排序

-u :去重复

-kn1,n2 :由n1区间排序到n2区间,可以只写-kn1,即对n1字段排序

[image]

[image]

[image]

4) wc :统计文档的行数字符数词数,常用的选项为:

-l :统计行数

-m :统计字符数

-w :统计词数

[image]

5 uniq :去重复的行,笔者常用的选项只有一个:

-c :统计重复的行数,并把行数写在前面

[image]

有一点需要注意,在进行uniq之前,需要先用sort排序然后才能uniq,否则你将得不到你想要的,笔者上面的试验当中已经是排序过所以省略掉那步了

6tee :后跟文件名,类似与重定向”>”,但是比重定向多了一个功能,在把文件写入后面所跟的文件中的同时,还显示在屏幕上

[image]

7tr :替换字符,常用来处理文档中出现的特殊符号,如DOS文档中出现的^M符号常用的选项有两个:

-d :删除某个字符,-d 后面跟要删除的字符

-s :把重复的字符去掉

最常用的就是把小写变大写: tr ‘[a-z]’ ‘[A-Z]’

[image]

当然替换一个字符也是完全可以的

[image]

不过替换删除以及去重复都是针对一个字符来讲的,有一定局限性如果是针对一个字符串就不再管用了,所以笔者建议只是简单了解这个tr即可,以后你还会学到更多可以实现针对字符串操作的工具

[image]

8split :切割文档,常用选项:

-b :依据大小来分割文档,单位为byte

[image]

格式如上例,后面的passwd为分割后文件名的前缀,分割后的文件名为passwdaa, passwdab, passwdac …

-l :依据行数来分割文档

[image]

6.  :分号平时我们都是在一行中敲一个命令,然后回车就运行了,那么想在一行中运行两个或两个以上的命令如何呢?则需要在命令之间加一个”;”

[image]

7. ~ :用户的家目录,如果是root则是 /root ,普通用户则是 /home/username

[image]

8. & :如果想把一条命令放到后台执行的话,则需要加上这个符号通常用于命令运行时间非常长的情况

[image]

使用jobs可以查看当前shell中后台执行的任务fg可以调到前台执行这里的sleep命令就是休眠的意思,后面跟数字,单位为秒,常用语循环的shell脚本中

[image]

此时你按一下CTRL +z 使之暂停,然后再输入bg可以再次进入后台执行

[image]

如果是多任务情况下,想要把任务调到前台执行的话,fg后面跟任务号,任务号可以使用jobs命令得到

[image]

9. >, >>, 2>, 2>> :前面讲过重定向符号以及>> 分别表示取代和追加的意思,然后还有两个符号就是这里的2>  2>> 分别表示错误重定向和错误追加重定向,当我们运行一个命令报错时,报错信息会输出到当前的屏幕,如果想重定向到一个文本里,则要用2>或者2>>。

[image]

10. [ ] :中括号,中间为字符组合,代表中间字符中的任意一个

[image]

11. &&  ||

在上面刚刚提到了分号,用于多条命令间的分隔符另外还有两个可以用于多条命令中间的特殊符号,那就是 “&&””||”。下面笔者把这几种情况全列出:

1) command1 ; command2

2) command1 && command2

3) command1 || command2

使用”;”时,不管command1是否执行成功都会执行command2 使用”&&”时,只有command1执行成功后,command2才会执行,否则command2不执行;使用”||”时,command1执行成功后command2 不执行,否则去执行command2,总之command1command2总有一条命令会执行

[image]


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/450107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「分块系列」数列分块入门3 解题报告

数列分块入门3 题意概括 区间加法&#xff0c;区间求前驱。 写在前面 这题的方法与分块2方法极其类似&#xff0c;建议自行解决。 正题 和上一题类似&#xff0c;但是二分不是用来计数的&#xff0c;而是用来求小于c的最大值的。然后对于不完整快&#xff0c;将小于c的值求最大…

创业者自述:我的第一桶金是如何来的

记者采访王宏筠的当天&#xff0c;北京气温已达到30℃&#xff0c;王宏筠从他的铁灰色奥迪A6车上下来&#xff0c;一身挺括的西装&#xff0c;打着领带&#xff0c;肩上背着一个超大的牛皮包。后来他对记者说&#xff0c;穿西服是因为多年在外企养成的习惯&#xff0c;一年中至…

Git cherry-pick后再merge出现一个“奇怪”的现象

背景描述&#xff1a;有的时候基于一个master branch拉出一个独立feature分支做开发时&#xff0c;两条分支都在并行开发&#xff0c;如果master分支增加了某些功能&#xff0c;解决了某些关键bug&#xff0c;而独立feature分支不需要所有的增加的commit&#xff0c;只需要某一…

inux系统中如何进入退出vim编辑器

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 VIM编辑器&#xff0c;可以新建文件也可以修改文件&#xff0c;命令为&#xff1a;vim AAA 。AAA就是文件名。 如果这个文件&#xff…

C++ 智能指针六

/* 智能指针unique_ptr */#include <iostream> #include <string> #include <memory> #include <vector>/*unique_ptr 独占所指向的对象, 同一时刻只能有一个 unique_ptr 指向给定对象(通过禁止拷贝语义, 只有移动语义来实现), 定义于 memory (非memo…

如何掘到第一桶金

第一种类型&#xff1a;才智高远型 典型代表&#xff1a;《福布斯》中国富豪榜排名第一位、个人资产总计达到83亿元的中国希望集团刘氏兄弟。 与一般的创业者不同&#xff0c;刘氏四兄弟刘永言、刘永行、刘永美、刘永好一开始就悟透了“舍得”二字。他们本来都在国家企事业单…

Sublime Text3中文环境设置

Sublime Text3中文环境设置 1、首先打开安装好的的Sublime软件,选择Preferences下面的Package Contorol选项出现弹窗方框 2、在弹窗输入install package,选择对应&#xff08;默认第一个&#xff0c;如图这个&#xff09;命令点击进入;安装的时候&#xff0c;左下角会有进度条显…

C/C++图形化编程(2)

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 站在巨人的肩上是为了超过巨人&#x…

Git clone之后你的硬盘上究竟发生了什么?

网上关于Git的使用有太多的博客&#xff0c;文章在讲解了&#xff0c;大部分是在讲解命令的用法&#xff0c;剩下一部分则在讲解git的内部原理&#xff0c;看过讲解基础命令使用的文章后&#xff0c;正常的开发使用是没有什么问题的了&#xff0c;而如果想更深入的了解git“高级…

Shell 语法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 1. 运行sh脚本的2种方法&#xff1a; ./AAA。sh 或者 sh AAA.sh 。&#xff08;其实后辍名不重要。是txt也是可以运行的。&#xff09;…

感知机模型的对偶形式[转载]

转自:https://blog.csdn.net/jaster_wisdom/article/details/78240949#commentBox 1.区分一下易混淆的两个概念&#xff0c;梯度下降和随机梯度下降&#xff1a; 梯度下降&#xff1a;一次将误分类集合中所有误分类点的梯度下降&#xff1b; 随机梯度下降&#xff1a;随机选取一…

Android Studio常用快捷键

注&#xff1a;本文大部分内容转载自——码个蛋微信公众号里的“熟练这些&#xff0c;才会知道 Android studio 有多高效”由于是微信公众号通过传送门看的&#xff0c;没有原文链接。 显示方法的参数 当我们使用一个方法的时候&#xff0c;会在刚开始的时候显示出所有的参数。…

中国城市政治地位,政治地位决定一切!!!

第一政治等级&#xff1a;省级城市&#xff08;包括直辖市、特别行政区&#xff09;6个 北京市、上海市、天津市、重庆市、香港特别行政区、澳门特别行政区 第二政治等级&#xff1a;副省级城市&#xff08;含五个计划单列市&#xff09; 15个 沈阳市、大连市&…

Shell 字符串截取

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 Linux 的字符串截取很有用。有八种方法。 假设有变量 varhttp://www.aaa.com/123.htm 1. # 号截取&#xff0c;删除左边字符&#xff0c;…

go语言渐入佳境[6]-operator运算符

运算符和其他语言一样&#xff0c;Go语言支持多种运算符&#xff0c;用于对变量进行运算。12345678910111213package mainimport "fmt"func main(){ //math() //relation() //logic() //wei() Assign()}算术运算符123456789101112func math(){ a : 4 b:2 fmt.Printf(…

Android应用开发—setResult()的调用时机

本文转载自setResult()的调用时机&#xff0c;此处做了重新的排版&#xff0c;只是感觉markdown的排版比较好看些&#xff0c;侵删。 今天遇到这样一个问题&#xff0c;我在Activity-A中用startActivityForResult()方法启动了Activity-B&#xff0c;并且在B中通过setResult()方…

记录腾讯云中矿机病毒处理过程(重装系统了fu*k)

2019-1-21日常上班的周一 刚想学学kafka&#xff0c;登录与服务器看看把&#xff0c;谁知ssh特别慢&#xff0c;很奇怪&#xff0c;我以为是我网速问题&#xff0c;断了wifi&#xff0c;换了网线&#xff0c;通过iterm想要ssh rootx.x.x.x&#xff0c;但是上不去&#xff1f; 就…

从创业失败中学到的七条教训

摘要&#xff1a;每个创业者不可能首次创业就能成功。他们的失败经验&#xff0c;或许可以指导其他创业者获得迅速成功。Joshua Hays在文章《7 things I learned from failing that you can avoid》总结了创业失败后获得的七条教训&#xff0c;希望其他创业者可以从中有所收获&…

unexpected EOF while looking for matching ``‘

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 只是简单的测试一个shell 脚本&#xff0c;报错如题。 原因&#xff1a; 双引号格式不对。 引号切换为英语格式重新输入&#xff0c;再运…

对象反序列化出现类型不匹配的情况(spring-boot-devtools)

目前在做springboot项目的shiro session redis共享功能。但是有一个对象我把它放到redis中之后再取出来就会出现类型不匹配的异常 AuthorizationUser user (AuthorizationUser) cache.getSuper(key); 异常信息&#xff1a; java.lang.ClassCastException: com.ch.evaluation.a…