00:00
啊,那咱们现在呢,已经知道怎么去编一个简单的share脚本了,最基本的要求就是什么机制写上,写上以后呢,我们底下就可以紧接着把我们前面学过的利率图命令一个一个的顺序写上,他将来就可以按照执行的写文件的次序来逐行执行。那我这儿呢,有一个。脚本,它可以用来显示你。当前主机的。系统信息,比方说我想知道当前主机的硬件配置,包括操作系统、内核若干版本。那我们可以这么来。编一个脚本。显示CPU是什么型号,显示内存有多大,显示硬盘有多大,显示操动版本,内核版本。
01:04
那要想把这些信息写好,实际上我们可以用一个简单的命令,就是可以把我们前面学过的命令呢,写到这个脚本里,就可以达达到这个效果了啊怎么做呢?就是我们写一个,这样我们为了将来看起来更方便,我们把脚本放在这个里下。啊,把我们刚才写的那个也算是第一个脚本吧,哎,不放在这儿了,放在哪呢?贝下个B是吧,在这来给它移到这来啊以后我们把脚本都扔在这,然后我们写一个什么呢?写一个系统信息。叫系统硬货。这个脚本写的时候,这个文件名尽可能写的跟你的脚本的功能相匹配。
02:01
尽可能写一些英语的单词,不要用中文来命名文件名。也不要用汉语拼音。汉语拼音不专业不是不行啊。让人会嘲笑的啊,当然说英语不好,那咋么办?你查字典嘛,对吧,临时查查出来写进去不就得了啊,那就是井号叹号应,但那实际上我要想查看CPU,那我们用有一个命令叫LSCPU,我要查看内存,我要查看硬盘,我要查看内核版本,我要查看操一动版本,是不是都是可以用命令来实现的。所以我们可以简单的就把这命令写上,然后我们就执行一下,比方说我们加上执行条件,然后跑一下,你看这不就都出来了。
03:01
当然这个东西我们如果你直接这么显示,有点乱,不好看,所以我这做它一个过滤,挑出我们关注的内容来,那这个脚本呢,我在我的服务器上预先写过一个,我看我这儿有没有案例啊,如果有的话,咱们拿过来用就行了。好,那这里边还没有啊,这有,不过这个呢,是我们后面要经过修改的。好,来看这边,我们把这个命令拿过来。这就是我们编的一个系统的信息的脚本,这个脚本呢,我们可以先放在这儿让大家看看啊,我们刚才那个脚本太简陋了,那这些东西不要了。啊贴一下对吧,大家看啊这段脚本里面。
04:02
这个东西先不用管它,这是加颜色的。然后大家看这这些命令实际上就用到了我们之前学过的一些命令,叫后name是不是主机名,这是不是就是把你的IP地址取出来。大家看这个命令是不是我们上午学过的正能表达式写法,看到没有,哎,然后这个是你的操一懂的孙的版本号啊,这是内核版本号,这CPUCPU型号,CPU型号呢?如果我们用LSCPU显示的CPU信息太多,我们只关心什么呢?只关心这个。这是不是就CPU型号,那么这个我CPU型号怎么把它拿出来呢?我这是做了处理的,大家看怎么处理的呢?是gra先把这个module name这一行先过滤出来,过滤出来以后是不是就找到了这一行,对吧?找到这一行前面的东西不要,只要后面这一部分,那怎么弄呢?诶你看我这是怎么用的。是不是就是用TR压缩,压缩完了以后按空格作为分格符,用冒号对分格符是吧?啊作为冒号对空格符,然后取它的第二列,就把这个信息取出来了,你看它这个是不是,呃,看看那冒号做分格符,冒号做分格符这个是第一列,哎,然后这个是第二列,然后空格隔开,所以我们这样取完以后就可以取出它的这个CPU型号了啊然后接着我们在这儿又实行了这样的一个命令,这个命令就是查出我们内存的啊最大值,这个内存的空间,内存呢,我们用free命令可以看。
05:36
这个就是内存的总大小,那内存怎么把它查到呢?是不是也是把这一行先过滤出来,把这行过滤出来以后,然后接着再把第二个数字取出来,怎么取呢?你看是不是也是压缩到空行,用cut把它取出来对吧?那硬盘也一样,硬盘的话呢,用LSB是可以看到硬盘的大小的,不就有一个200G的硬盘吗?
06:00
那这个硬盘怎么怎么把它找到呢?不就在这行吗?那这行是不是就是我们过滤的时候,你看怎么过滤的,SD开头过滤的,然后TR是不是也是用空格把它压缩掉,那空格作为分格符取它的第四列就取完了,所以最终呢,这个脚本,那我们来执行一下看看效果。看到了吗?这就是我们当前主机的信息。而且还带了点颜色。是不是感觉这个小脚本还有点意思吧,啊,所以这个脚本将来是不是就可以。到生产中,你觉得?想了解一下这个机器的配置,这些就不用一个个看了,跑一下完事了。当然这个脚本呢,在我的服务器上应该曾经写过一个啊,我看看没有。
07:12
好,我连到我的机上去啊。好,然后呢,我这在贝塔3W这个目录下有个t there,这里面有没有一个c in的一个脚本也有。这个脚本看一下怎么写的。啊,跟我刚才写的是一样的。所以你们现在就可以执行一下了啊,当然这个机器是在互联网上,你应该知道怎么访问怎么访问啊,刚才说过了,二杠SHTTP风行线,写上我的网站名,有一个test。
08:10
走。你们现在每个人都可以执行了是吧?诶然后再加个这就行了。就执行啊,你们每个人执行一下,然后把你们的执行结果截个屏,发到咱们那个课堂里,我看看你们的执行结果,看看是不是都会执行啊,不一定自己会写,但是会执行了吧,至少。是不是,哎,这个已经都执行完了。嗯。哎,我看大家都执行的还是很快的啊。
09:02
哎,看看你们的CPU配置还不错啊,9750H可以的啊。啊,看看谁的CPU好啊,你们可以比一比了,对不对,其他的比不出来内存,因为那个东西可以调的啊,但是有些同学配置应用CPU有点弱呀。这个这个爱我的,这是。魏瑞的是吧,魏瑞的这个CPUU还是4258UU,低电压的,这个配置可能差点意思吧,啊,低电压的,不过这个是笔记本专用的。哎,我看大家都跑出来了。配置还都可以的。啊,你看这个有同学同学的主机名设的有问题啊。
10:07
哎,你们上面有一个。网卡的地址可能设置了两个地址,你看有同学三个地址。他的IP有三个,那我这只有一个,因为你们有些软件一看就是不是最小安装,你们那个CPU就是你的系统没有最小安装啊,看同学就发现你们没有最小安装。刚才上次说了,要求你们回去最小安装啊,没有最安装,重装一下系统啊,最小安装。啊,这个鹏飞同学的这个笔记本这个配置好啊,4800H啊,新本是吧,新本。嗯,远强这个也是新本,你们都是最近买的618买的吗?凑凑这个时间买的哈。
11:19
啊啊,看来大家都执行了啊,不错。李阳同学都把把颜色都改了,李阳同学把这个颜色都调了,爱七第十代。
12:09
好,看来大家现在都会写,都会执行脚本了是吧?脚本执行已经会了,接下来那你就考虑考虑怎么写脚本了,那写脚本的过程中,尤其初学呀,咱们经常可能会犯各种错误,即使是老司机在执行过程中可能也会遇到各种错,这还有98099900K的呢,有有谁呀,哎呀,真是有,哎哎,这个这个是大佬啊,这个是土豪啊啊土豪啊,单发同学是吧?这个名字就是发哥是吧,叫发哥啊发哥是吧,厉害啊。
13:10
好,那这个CPU配置不错啊,所以到时候写脚本你一定写的是最快的,所以我这布置一个脚本题,希望你能第一个提交你的命,你的这个脚本命令执行快呀,对吧,你的,所以写脚本必须快呀,咱发东西八哥是吧。
14:00
好,那现在咱们这个脚本的书写在执行过程中或许会犯一些错误。那这些错误呢,大体上可以分成两两类,一类呢是命令错误,一种呢是语法错误。那命令错误?这个好解决,因为他的无非就是命令敲错了。那比方说我们写这样的一个脚本,这个脚本呢,我们犯一点小错误。引号、叹号并用。那如果说我们这写个这样的命令,叫begin,叫开始。那后面呢,我们就想写些命令,那当然这个命令呢,不小心给写错了,比方说我们就想写一个后name,结果少写个E字母,那现在请问大家。
15:12
这个命令如果出了错的话,后面的这个命令会继续执行吗?大家看啊,我这中间写错了一个,后命令少了个E字母,那这个命令是错的,后面这个命令还会接着执行吗?明明执行了呀,命令出错,不会影响后续的命令继续执行。明白吧,命令错误它不会影响,当然我们说的是一般情况,也就是说我们可以通过设置,如果发现命令出错,我可以阻止他继续执行,这是可以的,不过呢,这个是我们后面要讲的了。
16:09
那默认情况下命令出错仍然会执行,那这个错误好看好理解,好解决,因为它提示很清楚,第三行。那么还有一种错误呢,叫语法错误,语法错误呢啊,比方说我们这里面加了一个语法出错的命令。比如说if if呢是我们后面要讲的一个关键字啊,这个命令它是有一定的条件要求的,后面要按照一定的格式写,结果呢,写错了,写错以后,那么这个命令语法出错,会不会导致后面的命令不继续执行呢?大家发现没有?执行了吗?那我发现好像command啊,这个加这个加了个点,好大家看test starting执行了,那但是我们发现第七行它提示我们说语法出错。
17:17
而语法出错之后,显而易见,大家发现这个LSE啊,这个语法错了,错了以后导致这些命令都不执行了。所以语法错误会导致程序不会继续执行,但是前面的命令该执行还是要执行的,因为它是解释性语言,解释性语言是不是就是读出一条,如果没有问题,那就执行了,执行完了以后接着读第二条。一条一条来,它不是作为一个整体的。所以。即使中间的语法出错,它也不影响前面举执行。所以从某种角度来讲,这也是不好的事,为什么这就会造成一个错误的现象,就是我们一个脚本可能执行了一半,执行不不下去了。
18:02
中间报了错,是不是就导致我们程序执行了一部分而没有全部执行?造成烂尾现象,这个烂尾现象有的时候还不如不做,有些事做了一半,是不是还不如干干净净没做呢?就是这样,你留了一个烂烂摊子,还不如让人家从头开始做呢。有时候就开始开始从头做,反而省事。所以这个也是不好的事情啊,所以我们想办法可以来解决这个问题啊,那这个语法出错呀,咱们实际上有一个命令是可以帮我们避免语法出错的。避免说因为语法出错导致执行力半,而我们有一个叫BA的这样的一个选项,这个选项可以来实现语法检查。这个语法检查,那在这在初学脚本的时候,我们可以通过杠N来检查语法。
19:04
但是他只能检查出语法错误,不能检查出命令错,所以我们现在来讲呢,他能查到说第七行语法错误,而且他不会给你执行。所以这样的话就避免了出现烂尾的现象,他发现语法错误,那你看我们找到第七行,当然他有的时候这个第七行不是那么准啊,实际上大家发现没有,实际上我的错在第一第第三行。但是它竟然显示是第七行,所以有的时候出学的时候有点就弧度了,你告诉我第几行,怎么这行没错啊,找半天找不着,哎,实际上它是周边的行出错了。理解了吧,哎,啊,所以呢,这个命令就出现了这样的一个错误。那我把这个错误呢,给它修正过来,比方说我把这行可以加井号注释掉。这个井号呢,就是表示不执行的意思。啊,不知行把它注释掉,那现在你看再检查语法没有错。
20:04
用杠N可以检查语法,语法错误比较好找错误。因为它会导致我们的程序它根本就不会执行下去了。而另外一种错误就非常难找,什么错误呢?就是逻辑上的错误。这种逻辑上错误,它不会阻止你程序的继续执行。哎,他给你跑完了,结果发现得到的结果不是你期望的结果。莫名其妙的结果。啊,你像我们上午写了一个正则表达式,哎,那个执行怎么没想到是那样一个结果。后来想一想啊,闹了半天,他是那个原因。那就是他出乎意料了,那这时候这种逻辑上的错误呢,是不容易找错误的。嗯。所以我们在执行逻辑上的排查的时候,比如说你明明想创建一个新文件,结果发现这个文件没生成。
21:05
好奇怪,那这时候你就特别想知道他咋回事?但是你的脚本那么多,一下写了100多行,那到底哪一行出了错呀,不知道了。那这时候为了解决这个问题,我们可以通过有一个选项叫。X的选项,这个X的选项它能够用来着行执行,并且把每一行执行的过程,每一行执行的显示结果在屏幕上直接显示,也就是说它不是解示执行吗?解释一行,解释一行,执行一行,然后把直接把这个结果在后面就紧接给你显示。这样的话,我是不是就马上就看到了,说这一行执行它什么结果,而不是说最后总的一个结果。这样的话,我们是不是就可以通过逐行执行,着行观察,着行跟踪,从而了解执行过程,尽快的找到出错的地方?
22:02
大家看。这是不是执行了这条命令的执行结果,执行了这条命令的执行结果,执行这条命令报了个错,执行这条命令的结果,所以我们是不是就啊知道这行出错了是吧?这行错是从哪来的?是这行出错了是不是,所以用杠X可以来实现跟踪调试。所以这也是我们初学的时候,当然实际上也不一定出学,就是你未来将来编脚本可能会遇到一些莫名其妙的结果,不是你想象那样,所以你可以用杠X来调试。20岁。啊,那这是调试的两个用法。啊,比方说你看我这边有一个这样的文件,这个文件呢。这样的一个内容,好,那我现在呢,把它写到一个文件里去。
23:05
嗯,好,我们写一个TEST2。啊,有这个里面怎么带那个刀了,把那个Dollar去了,删除Dollar全文搜索搜索Dollar。空代替,但是我直接这么删行不行。你这样删他把那个刀当成啥了?啊。他是不是把Dollar当成行尾呢?是不是我们需要转一下E啊,讲一下E才行是吧,因为Dollar本身是不是属于正则表达式的原字符了,好这样的话我们就写完了这样的一个脚本,大家看这个脚本。
24:04
看上去。执行了一个这样的命令,但是这个命令呢,中间犯了各种错。啊,首首行释放机制不就没写吧,是吧,首行释放机制就没有写,所以我们这个地方加上一个释放机制,当然大家可能以后也会发现,哎,不写释放机制也能执行啊,不过呢,这个不规范。啊,我们还是把它写上,然后写上以后呢,我们现在这个脚本可以来跑一下了,那我们来执行一下,好,我们把这个脚本运行一下呀,报错了。那这个错误显示是。第三行和第九行出错,第三行的错呢,他说命令没发现,那所以这个应该好找啊,不就是这个地方少了个E字母吗。对不对,哎,那再执行一下,诶,发现是第九行报错,第九行报了一个啥错呀,他说here document here document就是旧地文本,也就是我们前面提到的多行重镜像。
25:09
它是什么呀?他说在第四行是你标识用u off做结束的,但是第九行你没有用它做结束,没有做结束吗?我用EF开头,是不是叫UUF结束啊。是拿这个结的束吗?那我们这个地方明明就是uf结束啊,我也没写别的呀,就是因为有一些看不见字。暴露了吧,是不是因为最后一行它不是真正的uf,它这个地方有一个空格。
26:03
所以你要不用这种方法,你看不出来,你盯盯上1万遍,你也看不到这个不可见字符,把它删了再执行一次。啊,同时这是我们生成的这样的一个test文件,是不是生成了,明白了吧,所以现在大家知道了,有些时候啊,你拿这些不可见字符要看的时候要知道,当然我们要看的话,也可以用这个方法来。杠A,杠A的话,是不是也能够看到那些不可定是吧,所以我们说了u off必须以整行uf前后不能带东西,否则语法错误,这属于语法错误。啊,所以尤其初学的时候脚本啊,大家可能不小心加入空格,导致这个检查不出来,那这个错误就是这样的一个问题。
27:08
那语法错误,命令错误,这是比较常见的。最难处理的就是逻辑错误。逻辑错误就是你犯的逻辑上的错误,比方说你按照原来的逻辑,第一步执行完,应该执行第二步,结果你不小心给写成第三步了,嗯,所以最终的结果就不是你想象那样。所以这样的话呢,这种错误需要通过大十杠X逐步执行来进行排错。好,那这是我们写脚本啊,它的一些调试方法,这里面在编脚本的时候,我们会更多的会东用到一些比较灵活的写法,比方说变量。变量大家不陌生啊,初中学过,X等于十,Y等于20。
28:07
是吧?Z等于X加YXY是不是就是Z也都是变量啊?那变量,那变量变量不就是变化的数据吗。那么在Linux中,Shell编程包括其他开发语言里面变量,就是为了保存一些变化的数据。未来将来你变这个数据的话,哎,好改好好好修改。我们通过变量将来可以代表着某一个数据,将来在别的地方定义完变量之后,就可以引用这个变量,如果我们定义变量之后,这个变量引用了十次。那将来我们想改这个变量,只需要在前面把变量的值改一下,那么调用此变量十次的这个地方就都改了。我们就省得一个一个去改十次数据对应的数据了,这变量可以节约这个修改的啊这个。
29:08
效率可以提提高效率。变量呢,它就是一个字符串。它可以用来保存变化的数据。变量的名称,一般来讲咱们都拿英文的这个英语英语单词来表示。那变量。系统本身就有一些变量。大家记得我们曾经接触过的这些变量吗?这是系系统内置的变量,咱们叫内置变量,那这个内置变量呢,啊,咱们这些呢,都应该很多都见过。那么除了这些系统的变量,我们将来用户也可以自定义变量。啊,比方说我就想定义这个显示不同的颜色。
30:05
那这个不同的颜色呢,我想显示,那刚才这个地方打印这个我想换颜色,那显示颜色呢,我们可以在这个地方人为的加,比方说杠一啊,加上颜色怎么加来着。斜杠12033也可以,然后中国号什么一啊,比方说你想你们喜欢啥颜色,喜欢绿的哈,好绿色就绿色,喜欢绿的那就给你绿的啊。绿色好,然后呢,把这个加上在结束颜色零对吧,当然这个绿色呢,你肯定很多地方都会显示喜欢绿灯,比方说hello,别老hello了。这个换一个吧,叫welcome to那一丢这,但是你发现没有,如果这个东西显示很多次的话,这个颜色我都会敲很多遍。
31:08
那待会我复制粘贴到还快啊,复制粘贴快啊哈you,哎,那现在我们把它保存一下跑一遍,诶绿的。可以了,但是现在我看绿的不喜不喜欢了,我又想换个红色,换个别的颜色,那这时候我们是不是就得把这些东西都改了啊,那这个改的话呢,虽然我们有搜索替代吧,但是总是不爽,那所以我们可以把这个颜色呢,给它定义出来,统一的定义成变量,对吧,那下来我用的时候就可以反复用了。那接下来咱们就来说说变量怎么去定义和使用。变量的使用呢,无非就是两个过程,第一定义变量,第二引用变量,调用变量对吧?那比方说最简单的就是name姓名。
32:06
内蒙两双王,那这时候呢,我们就对内蒙这是个变量,就给它起了个名字叫王。当然在用的时候呢,一定要注意这个变量的名称呢,尽可能用英语单词。也不要用我们系统内置的变量,因为这些内置变量都是有含义,不要随便改。哎,所以我们在定义变量的时候呢。这个变量一定找一个,不是内置变量,当然这里面就有个问题,那我怎么知道内置的变量有哪些呢?内置变量呢,实际上也可以通过这个命令来看。S的命令,它可以把所有的变量显示出来,内容特别多。还可以表显示函数,最下面都是函数,我们不管它,先先看看往上翻,当然我们可以分页显示一下,你看这些都是变量,这些变量你就不要用了,这都是系统自身带的变量。啊,自身带的电量。
33:02
啊,所以我们自己用变量,当然我们刚才定义的内容在不在呢,你看一下这里面有没有我们刚才定义的内幕啊。是不是有啊嗯,所以自身带的变量你就不要用了,那就找一个没人用的变量,而且呢,你发现它是不是好多都是大写,所以呢,我们定义变量的话呢,也可以用大写啊大写那么变量的名称写成英语单词。不要用数字,要用数字也不要在前面写,而是数字在后面,而前面是字母,后面再加数字。这可以。量,那变量的使用,在不同的开发语言里面,它的使用逻辑方法有不同。有些开发员里面使用变量,声明变量和使用变量,这个有一定的要求。生命变量在有些开发源里面要求明确的告诉我们变量是存放什么数据。
34:06
你是存放数字,那如果是数字的话,是整数还是小数啊,你这个必须要事先得。对外宣称一下才行啊,你得声明一下。因为你只有声明了以后,在系统中才知道将来这个变量在内存中占多大空间,给你预留空间。啊,Java就是这样的,但是对于我们目前学的share没那么复杂,你直接对变量进行赋值就好了,而且呢,它默认情况下,对你变量的赋的内容通通都当成一个固定的形式,就是字符串形式。也就是说,你对变量即使赋于数字,他也在他的眼里当数当成字符串的。所以在share中,咱们这个变量呢,比较简单,而且呢,即使你将来给数字的话。
35:04
在目前线中,它不支持浮点数。所谓浮点数就是小数知道吧,哎,那么这边呢,有一个各种开发语言的这个分类,这个分成什么动态语言。和静态一元以及。强语言和弱语言啊,强类型弱类型,那么利用这两个特性。分成了四个象限,那这个东西我觉得太专业,大家了解一下就行了。所谓的静和动,说的就是是否在使用变量前必须先声明类型。啊,比方说Java Java呢,你就必须要生命类型,你不生命类型它没法用。你是整数小数字符串,你就得说清楚再说啊。那静态的就必须声明,而动态呢,不需要声明,你像我们现在的share就不需要声明。
36:03
还有就是弱类型和强类型。强类型弱类型,那就是我们两个不同类型之间的数据进行。操作的话,运算需要不需要强制转换,那么强类型是必须要强制转换,弱类型你不用转换,它自己就可以给你内部自己自动做转换了。啊,比方说Python Python呢,现在我想把马格一丢和十这两个给它串在一起,马格一丢呢是一个字符串。十是个数字,这两个是不同类型的,不同类型的,你要想把它串在一起,用你直接这么串是不行的。啊,那么我们需要人为的先把十转换成字符串再用。马哥一丢,串起来才能形成一个新的完整字符。所以这个东西就是强了一些。
37:01
而若类型,直接串就行了。我们share既是一个动态编译语言,它同时也是一个弱类型语言。那么这个图说的就是强弱动静的一个象限的分工。啊,这个大家因为不是做专业开发啊,等你们将来学Python。啊,老师到时候还会给你再讲讲这个图。啊,到时候你可能就理解的更深刻一些,暂时先不用看啊,因为大部分同学没有开发基础。想也想不出来啥意思是吧。好,刚才我们说了share变量,它的名称命名有规范,不要用,内置的变量也不要用。关键字啊,就是你不要利用内置的有含义的一些单词。和内置命令和内部。
38:03
啊啊,这个内部变量就是内置变量。啊,比方说if for这些都是属于系统自带的关键字,它有特殊作用。包括内置的变量你也别用,因为打架了啊,哎,我说的是不要自己去使,不要自己去用它来去进行修改。因为你要是拿自己定义了,那么就把原来内置的变量给覆盖了。只能使用数字字母下划线开头,而且不能以数字开头。啊,不支持短横线,它和主机名相反,也就是说变量呢,你不能用变量,不要用横线,而主机名可以支持横线,不支持下划线。还记得吧?哎,所以这个不太一样,然后我们起的变量名叫建名之意啥意思啊,就是你起一个英语单词,一看就知道啥,你看name是不是大家都知道名字的意思是吧,Age年龄是吧?Six性别是吧?一看就知道,你得写个ABCDABCD啥意思啊,不知道。
39:16
你方便别人都看不懂了是吧?不要用一些单词简写,不要用单词简写,比方说at ma啥意思啊,ATM不同的场合含义不一样,生活中都是取款机是吧?那事实上ATM网络里面有一个专业术语叫异步传输模式。啊,以前面试的时候,我在二年前面试是吧,人家面ATM啥意思啊,人家说就好多人就不知道啥意思,那我当然也就知道了专业的称呼,异步传输模式。啊,当然,令非说这是奥特曼是吧?啊,网上一搜索,现在就是奥特曼,知道吗?
40:02
那你要,所以你用这种名字,这个称呼就有点搞不清啥意思,哎,最好写英语单词,还有就是我们在规范命名的时候,尤其名字比较长,可能会有多个单词串起来。啊,比方说我想表示学生姓名,我想表示老师姓名,大家想想老师姓名和学生姓名,那你这个变量名称怎么写,如果我们写name的话,大家都叫name,是不是就搞不清是老师的姓名还是学生的姓名了,那老师的姓名我们可以这么写,Teacher。内蒙那老师的姓名,学生姓名student,内蒙用横线连开,这种方式也是可以的,那还有一种方式呢,叫驼峰法,驼峰法说的就是一个单词的首字母,哎,大写,其他的小写。
41:03
看懂了吧,这两个单词呢的每个单词的首字母大写字母,这样的话是不是就区分出来是俩单词了。这个叫大驼峰,大驼峰就是每个单词的首字母都是大写,还有一种叫小驼峰,小驼峰说的是这个就是只有第二个单词往后的单词首字母才大写,因为第一个单词它就在第一个那不用写了。对不对,不用瞎写,这就是小驼峰。在Java语言,很多开发语言里面都有这种使用规范,你像Java言里面一般来讲呢,类都是用大作风,方法小透风,那对于我们share编程,你也可以考虑用这种风格。当然,这种风格只是风格的区别,并没有谁好谁坏的区别。那么,所以在工作中到底用哪种风格?谁那用哪种啊。
42:00
如果你是领导,你说了算,如果你不是领导,听领导说了算。啊,只要一个公司里大家都统一风格就行,你别说公司大家都是大头峰,你非来整个小作峰。你这个不伦不类,格格不入,是不是大家就不带你玩了啊,玩不在一起了是不是啊,所以我们只要统一风格即可,是吧,这个东西也谈不上谁好谁坏,那么变量呢,一般来讲可以考虑大写,我是侧重于用这种大写字母。那大家可能发现系统的内置变量不就是大写的吗?大写好啊,大写比较直观啊,一看就是变量,它和我们Linux命令是不是能够明显的在一个文件中一眼就能区分出来。哎,所以大写字母这个是我比较推荐的。当然了,有些特殊情况下,变量比较小写,比方说在局部变量中,当然这个局部变量我们后面再说啊,还有就是函数名小息,这两个呢,都是我们未来要学的基础,你暂时先可以不看。
43:10
这是share命名它的一个法则。好,那接下来咱们来看一下变量的这个使用,变量呢,实际上它有分成多种类型,有普通变量,环境变量,本地变量,那我们先来说第一种普通变量,普通变量呢用的最多。普通变量也好,局部变量也好,还是环境变量啊,这些变量呢,它的这个使用都是要是通过两个过程,大概第一过程呢,就是先变量赋值。第二个再引用它赋值的方法很简单,就是变量名加个等号,后面跟个值,这个等号前后不要带空格。不要带空格啊,直接连有些开发语言里面要带空格,你要Java Java呢,这个前后有空格,实际上不加空格也可以,不过呢,一般都是为了漂亮。
44:05
美观,加空格,但是我们在share中还真的不能加,加上错了,加上语法就不对了,这不能加,所以咱们将来学不同的语言,它每个语言的格式要求不一样,所以你就参考这个格式啊啊,那这是变量赋值,变量赋完值以后,那么后续我们要引用它,引用的话呢,我们可以这么来引用。通过两种格式,一种是Dollar后面跟变量名,还有一种方式呢,就是Dollar划括号,后面跟变量名,那这种方式是比较推荐的写法,但是这种方式更加简洁。啊,所以很多人都喜欢用第一种方法,那么第二种方法呢,更加安全,这个我们通过例子可以来给大家说一说。那么变量的赋值,虽然说我们可以人为的把这个字符串或者值放在后面,但是有的时候这个值可能并不是说一个固定值。
45:04
它有可能是来自于另一个变量,甚至有可能来自一个命令,所以我们写的时候可能还会有出现这种想法,就是变量它的值来自于另一个变量。听了吧,哎,那这是不是就是我的值,并不是固定值,那你原来我的变量是来自于这个变量,而这个变量的值是什么,那我就是什么。啊,那么第三种呢,就是我这个命令这个变量的值来自于一个命令的执行结果,而这个命令直行结果我怎么去调动它呢?大家记得我们前面学过代号吗?反代号是不是就是把一个命令执行完了的结果显示出来。交给别的命令,那现在我们是不是就可以把这个命令的执行结果赋给了name name里存的就是这个命令的执行结果?当然我们说过,反代尔号和逗小括号是等价的。理解了吧,所以这个就是衍生出来的变量赋值。
46:01
好了,那既然这样,那我们现在就可以来试一试了,比方说我们现在就对name这个赋值,这个name赋值我可以人为的写一下,比方说这个是root啊,那现在赋完值以后呢,现在我怎么知道它成功了呢?刚才我们说过有个set命令是吧,Set命令可以显示所有,不过呢,这个要看的话太多了,所以我们要想只显示。这个name的值,那怎么办呢?我们有一个叫Apple的,Apple可以显示,但是呢,Apple你不能这么写,你这么写的话,它把这个name是不是就当成了一个字符串了,我现在是要显示内这个变量的值,那么说了,要引用这个变量加Dollar,看出来了吧?哎,出来了。当然,那如果你的变量改了名字了,比方说我们现在改成王,改了以后你再看它是不是就变了,所以这就是变量的含义嘛,变量变量是不是随时可以改啊,哎,随时可以改啊,当然那刚才说了,我们可以用括括号这种方式也是可以的。
47:08
括号看可以吧,可以啊,当然,那这时候如果我们有两个变量,比方说我们这还有个A,比方说20A20A20,如果我们想把这个姓名和A。来进行打印,那如果我们这么写,可以单独打印,可以打印,都可以打印,那如果我们要把两个变量都打出来,那我们能不能这样写啊,这样能不能打印。明明可以啊,明明可以啊,那我们现在要把它们下划线分开,或者是这个这个冒号分开行不行啊。
48:03
分开行不行?可以不可以,明明可以对不对,那我们就下划线分割可以不可以呢?明明不可以吗?那为什么不可以呢?这就跟我们前面讲的这个表达式有一个相通的地方,为什么不可以了呢?就是它把内和下划线作为了一个,它以为它是变量名。他没把内当成变量名,所以这时候他就搞不清变量和其他符号的分界符了,因此我要告诉内蒙,人家是个独立的变量,我们怎么办呢?加括括号这时候。推出划括号,明白了吗?所以有的时候需要加划括号,知道为什么了吗?就是为了和别的字符串分开,区分开,你不加的话,他搞不清了啊,这就是他背后的逻辑。
49:13
啊,这就是刚才变量的赋值变量的查看,那当然那我们也可以这么来玩,内蒙等于王。然后我们把这个内幕呢,刚才我们进行了一个打印。然后接着开c c to。是吧,打印一下开头。好,那现在这个title的值,比方说Y的值给它替换了。替换成什么呢?哎,替换成开。
50:04
这可以吧,就是我把一个变量的值给它改成另外一个变量的值可以吧,那我这样改完以后,那请问内的值是什么。内部的值是什么?CPU。是不是因为它它的值原来是往给改成title了,对吧?啊,当然那现在title又改了,开头改成啥呢?CEO了,升职了,升职加薪嘛,是吧,才能迎娶白富美走去,走上人生巅峰啊。那现在请问内幕是什么?升职加薪了吗?你要加薪吗?你知道要加薪的什么结果吧,那大家发现好像没成功啊,那这个怎么回事啊,你不都升职了吗?怎么升职了,怎么这个内怎么还是CP啊?那这个背后的逻辑是咋回事呢?
51:30
那这就是因为我们目前他的工作逻辑是这样的,我们刚才第一步的时候忙。啊,内膜是刚才设成了CTO。啊,这个title是CP啊。那我们这有一个title title title,它的值现在是CTO。
52:02
后来那你把这个内部的职业改成开头。那么内蒙是个变量名,内内改成以后,那么它实际上都指向了CP。对不对,因为内的值就等于title的值嘛,Title呢和内实际上它就是一个数据存放的一个指针嘛,啊,然后后来你是不是又给把它改改了,给你又改了啥,变成CEO了,CEO不在这吗?那么title现在升值了,变成了CEO了,所以这时候它的指针就没了,就是这个地方指针要怎么把外圈给。向了,那大家想,那相当于我们是不是title指向的是CEO了,但是内幕指向的还是哪,还是CPU,明白了吗?内幕还没有改啊,他还指向C,那这就是背后的逻辑啊,背后逻辑好,这就是刚才通过这样的一个案例啊,大家知道了,另外呢,我们说过咱们这里面可以存放的内容。
53:25
可以是零来自于另一个变量,甚至还是可以来自于另一个命令,所以我们可以把一个命令执行结果给它放进去啊,比方说我叫post,等于啥呢?Post name name是是个命令对不对?那现在后name的执行结果就付给了host host,那我们来看一下host是不是有结果。你看它的数据来源是来自于利率啊。注意变量,我们不仅可以打印。
54:02
变量的执行不仅可以打印,事实上它还能不能这样做呢?比方说我能不能在一个变量里面写一个命令啊,我让这个变量等于命令。然后如果我们直接这么写。会有什么结果?大家看啥意思呀,是不是他把CMD这个命令,这个变量里面存的命令给执行了,所以我们用这种方式实现了一个所谓的功能,什么功能就是。动态命令。啥叫动态命令,就是这个命令啊,它是放在变量里,命令放在变量里。
55:03
变量的内容可以随着你的需要随时修改,所以这个变量值执行的时候,它的结果是可以变的,这个变量存的是一个命令,而这个命令你可以改啊,所以这叫动态命令,它不像我们一般的命令写死了,这个命令就是给结果。它是固定的,现在我们用了这种方法,是不是就实现了动态命令,因为它里面从东西你可以改呀,啊,你要说改成这个,那今天改成这个,那它的执行结果就是它对不对,那如果你再换一个命令,哎,比方说黑腿,那这时候它的结果是不是就变成黑了,所以叫动态命令,明白了吧。所以就是更加灵活了,更加灵活了。好,那当然咱们给大家实现过这些变量之后呢,我们现在就可以把我们刚才想做的一些事可以来改一改了。
56:07
现在这个颜色这个东西啊,哎呀每次,而且你看这么长这个Apple杠一这个东西我们都是去写出来的,这个多啰嗦呀,我们实际上可以把这个东西换成颜色这个变量。然后呢,我们甚至可以这么写,怎么写呢,我们把这个这个命令都写在里面。我把它写在这里面啊,然后这个我们这个东西我就不要了。然后这个结束,我们也用变量,比方说end啊,用什么呢?用这个。这个来表示。
57:08
给他串起来。啊,那将来这块我也不要了。那怎么去调呢?那就是Dollar。画括号括起来,因为要区分。然后这边再来一个,当然这个就用不着了,End啊,大家看是不是可以实现呢?那接下来这些东西我们是不是都可以替换成它呢?我们先改一个试试啊。好,那么这个脚本我们执行一下,你看效果是一样的。那效果一样,我们是不是就可以推而广之?
58:03
就可以这么改了。那这个东西我们是不是全给他剃了?把它替换成。好了,这就完了。那将来我们绿色看烦了,咱们想变成别的颜色,比方说变成这个这个红色,那就一就行了,是不是就改个31的问问题了。大家觉得以后是不是就特别方便,想换个色不就这个色吗?
59:04
所以换颜色是不是就轻松了?啊,我们换成自己喜欢的各种颜色。啊,所以大家现在看不出来,看我刚才写的那个,现在就明白了吧,这怎么来的,这是不是就定义了。红色和绿色两个颜色,将来这部分是绿的,下面这些是红的,看到没?这个结束是一样的,所以我就这样写了啊,所以现在再来看这段脚本,你就知道是怎么来的。
60:00
是不是很简单呀?好,所以大家发现啊,那这个脚本好像也没那么复杂,当然你看起来不复杂,真让你写估计。写半天。第四,写总是比较难的,你可能会犯各种错误是吧,甚至有点怀疑人生的感觉。这这明明都没错呀,看不出错呀,怎么老报错呀,是不是这个计算机有问题呀,不是我的错呀。啊,这是咱们给大家说的脚本,当然这个变量呢,如果你不想要了,也可以把它删掉,如果说我们某一个变量用完了不想要了。
61:03
你也可以把它去掉啊去掉。这个变量我们定义完了,如果你将来不想要了,你也可以用这个命令把它删掉,删掉,删掉以后你再看。就是删除变量。养成一个良好习惯啊,就是如果有些变量不要,你可以提前把它删了,要不是什么呢?要不它什么时候这个脚本结束才会给你从内存中销毁,所以有可能对一个大的脚本来讲,它会占比较浪费内存,因为它要不执行那个脚本占的变量,它就不释放。当然了,通常脚本还好啊,对于我们其他的开发语言,这个要求就更高一些。啊好,这是我们变量的赋值和引用。
62:00
那之前我们说过强勇弱云的问题啊,这个我们之前讲过了。那这边对于变量来讲呢,我们赋值还可以这么来赋值。例如,我这儿有一个文件的变量。文件的变量。它还可以支持。这么来写。这什么意思?那现在请问大家,我去执行费,它的结果是什么?他的结果是,新人宝。事实上,他不是,他是文件。
63:01
描述通配符,也就是说,星代表着当前目录下的所有文件。所以他就把所有文件付给了菲尔。看到没有,是不是付给了C2?那这里面需要注意啊。我们对变量赋值是允许写多个的,比方说我们这写王,我们分开,我甚至把这三个都分开。分开以后我们来显示一下。没问题吧,但是我们在赋值的时候,如果这是带空格,不加双引号或者单引号,这样行吗?
64:04
发现问题了吗?如果你这样写。他将把赋值语句后续的命令当成命令来执行,这个命令它会执行,这是赋值,这是命令啊,所以呢,如果你这样写啊,比方说我们写个马哥,后面你跟个命令,你看他是不是就把这个命令执行了。执行完了以后呢,我们现在看一下内部的值是什么。什么意思?那这样写的作用就是相当于临时的执行了。你看这个马哥的name的值好像不起作用。执行完了以后,你直接执行后续的命令,它仍然显示的是旧的,你现在这个命令是不是赋值就不起作用了?
65:01
但是它会导致后面的命令给你执行了啊,执行了那我们set一下看看,那这个地方改的是马哥,那看看内的值有没有,这里面有没有显示啊。啊,太多了,这样吧。那件显示这样有问题。这样不能分页显示。Echo。我是。啊。看看这儿有没有执行的结果。过去了吗?内蒙?有内幕吗?是不是还是旧的名字,那这个相当于不起作用吗?是不是你相当于没复制成功嘛。
66:10
啊,没复制成功,没封成功嘛,它把后面命令函当成命令执行了啊,所以呢,我们在执行的时候呢,这个地方如果有特殊符号,比方说空格啊符号啊,你这个要把它引起来。哎,引起来,那当然我们这个地方能不能写好几行呢?比方说我们这边写个文件等于。如果我们写多个文件行不行?比方说a.test。然后下来我们再写b.test c.test我写好几个行不行呢,也可以,不过呢,你加一个双引号,加个双引号,你看如果我加双引推车发现什么了,它是等着我输b.c.log b点啊这个这个。
67:06
双引号。这样的话呢,我们这个费存的就是abcd。当然他存完了以后呢,我们就要打印的话,这么来打。打出来的是不是就是各族的符号。当然。那加上双氧化引起来。发现又不一样。啥意思,因为你原来是换行,你加上双引号,我也保留括号。你不加,不加双引号,它就认为放在一行里了。看到了吧,因为你本身费尔是不是就是换行泛出来的。所以这些呢,都是。在编脚本的时候一些特点。困了吧?啊,好几个睡觉的,那咱们休息会儿吧,好吧,困了就说一声,终于下课了,就提前下课了。
我来说两句