当前位置: 首页 > 科技观察

是时候熟练使用Shell脚本了,你觉得呢?

时间:2023-03-22 13:54:30 科技观察

shell前言Shell可以接收用户输入的命令,对命令进行处理,然后将处理后的结果反馈给用户,比如输出到显示器,写入文件等,这是大多数读者对Shell的了解。我们都知道在Shell中输入catlog.txt命令可以查看log.txt文件的内容。但是,log.txt放在磁盘的什么位置?分为多少个数据块?它从哪里开始?它在哪里结束?如何操作探头读取呢?Shell并不知道这些底层细节,它只能调用内核提供的open()和read()函数,告诉内核我要读取log.txt文件,请帮帮我,然后内核才读取文件乖乖的按照shell的指令,将读取到的文件内容交给shell,最后由shell呈现给用户(实际上是靠内核来呈现到显示器上)。在整个过程中,Shell是一个“中间人”,在用户和内核之间“出卖”数据,而用户却浑然不知。中间逻辑如下:shell脚本可以结合很多外部命令行工具完成信息查询,简化文本处理,调度任务运行时间,生成报表,发送邮件等。shell是一种脚本语言。Shell并不是简单地堆叠命令。我们也可以在shell中进行编程,这与使用C++、C#、Java、Python等常见的编程语言没有区别。Shell虽然没有C++、Java、Python等强大,但也支持基本的编程元素,如:if...else选择结构、case...inswitch语句、for、while、until循环;变量、数组、字符、字符串、注释、加减乘、逻辑运算等概念;函数,包括用户自定义函数和内置函数(如printf、export、eval等)。从这个角度看,Shell也是一种编程语言,它的编译器(解释器)就是程序Shell。我们通常所说的Shell有时指的是连接用户和内核的程序,有时指的是Shell编程。Shell主要用来开发一些实用的、自动化的小工具,不是用来开发业务逻辑复杂的中大型软件,比如检测电脑的硬件参数,搭建web运行环境,日志分析等,Shell很适合.使用Shell的熟练程度体现了用户对Linux的掌握程度,运维工程师、网络管理员、程序员都应该学习Shell。尤其对于Linux运维工程师来说,Shell是必不可少的,也是必须掌握的技能。它使我们能够自动管理服务器集群。否则,您必须一台一台地登录所有服务器并执行相同的设置,而且这些服务器可能有成百上千台,将在重复性任务上浪费大量时间。任何代码最终都必须“翻译”成二进制形式,然后才能在计算机中执行。一些编程语言,如C/C++、Pascal、Go语言、汇编等,在程序运行前必须将所有代码翻译成二进制形式,即生成可执行文件,用户得到的是最终生成的可执行文件,看不到源代码。这个过程称为Compile,这样的编程语言称为编译语言,完成编译过程的软件称为Compiler。但有些编程语言,如Shell、JavaScript、Python、PHP等,在执行时需要进行翻译,不会生成任何可执行文件。用户必须获得源代码才能运行该程序。程序运行后,会立即翻译,并执行部分翻译,而不用等待所有代码翻译完毕。这个过程称为解释,这样的编程语言称为解释语言或脚本语言(Script),完成解释过程的软件称为解释器。编译型语言的优点是执行速度快,硬件要求低,保密性好。它们适用于开发操作系统、大型应用程序和数据库。脚本语言的优点是使用灵活,部署方便,跨平台性能好,非常适合Web开发和小工具的制作。Shell是一种脚本语言。我们写好源码后,不需要编译,直接运行源码即可。shell脚本是如何创建的?我们知道shell脚本是后缀为.sh的可执行文件,而可执行文件的内容就是我们今天分享的主角。#!是shell脚本的开始,如下图,这个开始叫做shebang。#!/bin/bash其中/bin/bash是bash的路径,但是我们在执行shell脚本的时候,往往会使用./xxx.sh的运行方式来执行,但是也会有shxxx的情况.sh被执行,那么如果脚本作为sh命令的参数被执行,那么脚本中的shebang行就没什么用了。为了让shell脚本独立运行,需要有可执行权限。要使脚本独立运行,必须使用shebang行。它在#!之后通过解释器运行脚本。至于脚本的可执行权限,可以chmod+xxxx.shchmod是linux下设置权限的命令,其中参数+x表示增加可执行权限。在hello_shell.sh中输入代码:这是运行步骤和打印数据的效果:基础部分——变量定义定义变量时,变量名不加($)符号,如:your_name="James"注意变量名和等号之间不能有空格,你熟悉的所有编程语言大概都不是这样的。同时,变量名的命名必须遵循以下规则:命名只能使用英文字母、数字和下划线,首字符不能以数字开头。中间不能有空格,可以使用下划线(_)。不能使用标点符号。bash中的关键字不能使用(使用help命令查看保留关键字)。除了显式直接赋值外,还可以使用语句给变量赋值,如:上述语句循环出/dev下目录的文件名。使用变量:要使用一个已定义的变量,只要在变量名前加上$符号即可:your_name="James"echo$your_nameecho${your_name}变量外的花括号是可选的,可以加也可以不加,变量的花括号名称外的大括号是可选的,您可以添加或不添加。加花括号是为了帮助解释器识别变量的边界,比如下面这种情况:goodat$skillScript”,解释器会把$skillScript当作一个变量(它的值为空),代码执行的结果不是我们所期望的。建议将所有变量都用大括号括起来,这是一种很好的编程习惯。your_name="tom"echo${your_name}your_name="bob"echo${your_name}是合法的,但是注意$your_name="bob"不能写在第二个赋值中,只有在使用变量美元符号($).只读变量readonly命令用来定义一个变量为只读变量,只读变量的值不能改变。下面的例子尝试改变只读变量,结果报错:#!/bin/bashmyUrl="https://www.google.com"readonlymyUrlmyUrl="https://www.baidu.com"运行脚本,结果如??下:deleteVariables使用unset命令删除变量。语法:unsetvariable_name变量被删除后不能再次使用。unset命令不能删除只读变量。Example#!/bin/shmyUrl="https://www.baidu.com"unsetmyUrlecho$myUrl上面的例子执行不会有任何输出。变量类型运行shell时,会出现三种变量:1)局部变量局部变量定义在脚本或命令中,只在当前shell实例中有效。由其他shell启动的程序无法访问局部变量。2)环境变量所有的程序,包括shell启动的程序,都可以访问环境变量,有些程序需要环境变量来保证其正常运行。必要时,Shell脚本还可以定义环境变量。3)Shell变量Shell变量是shell程序设置的特殊变量。shell变量有的是环境变量,有的是局部变量。这些变量保证了shell的正常运行。该类型易于使用),字符串可以使用单引号、双引号或不使用引号。单引号str='thisisastring'然后用echo打印出单引号字符串的限制:单引号内的任何字符都原样输出,单引号字符串内的变量无效;它不能出现在单引号字符串中单引号(即使在对单引号使用转义字符后也不能出现),但它可以成对出现并用作字符串连接。双引号your_name='James'str="Hello,Iknowyouare\"$your_name\"!\n"echo-e$str输出结果为:你好,我知道你是“James”!双引号的优点:双引号中可以有转义符拼接字符串our_name="James"#用双引号拼接greeting="hello,"$your_name"!"greeting_1="hello,${your_name}!"echo$greeting$greeting_1#用单引号连接greeting_2='hello,'$your_name'!'greeting_3='hello,${your_name}!'echo$greeting_2$greeting_3输出结果为:得到字符串长度string="abcd"echo${#string}#输出结果为4提取子串下面的例子从字符串的第二个字符开始截取4个字符:string="jamesisagreatbasketballplayer"echo${string:1:4}#输出ames注意:第一个字符索引值为0查找子串查找字符i或o的位置(先出现的字母算):string="jamesisagreatbasketballplayer"echo`exprindex"$string"mnt`#输出3注意:上面脚本中的`是反引号,不是单引号',不要误会。shell数组bash支持一维数组(不支持多维数组),不限制数组的大小。与C语言类似,数组元素的下标从0开始编号。要获取数组中的元素,需要使用下标,下标可以是整数,也可以是算术表达式,其值应大于或等于0。在shell中定义一个数组,用括号来表示数组,数组的元素之间用“空格”符号隔开。定义数组的一般形式是:在Shell中,数组用括号表示,数组的元素之间用“空格”符号隔开。定义数组的一般形式为:数组名=(值1,值2...值n)例如:数组的每个组成部分也可以单独定义:可以不使用连续的下标,下标的范围不受限制。读取数组读取数组元素值的一般格式为:${数组名[下标]}例如:valuen=${array_name[n]}使用@符号获取数组中的所有元素,例如:echo${array_name[@]}获取数组的长度获取数组长度的方法与获取字符串长度的方法相同,例如:#!/bin/basharray_name=(value0value1value2)#获取数组元素的个数length=${#array_name[@]}#orlength=${#array_name[*]}#获取数组单个元素的长度lengthn=${#array_name[n]}echo$length$length$lengthn输出结果为:336ShellNotes#开头的行是注释,会被解释器忽略。通过在每行添加#符号来设置多行注释,如下所示:#----------------helloworld------------------------#如果在开发过程中遇到大段代码需要临时注释,过一会取消注释,怎么办?每行加一个#号太费力了,可以把这一段加注释的代码用一对花括号括起来,定义为函数。如果没有地方调用这个函数,这段代码就不会执行,达到和注释一样的效果。多行注释多行注释也可以使用如下格式::<