Linux shell脚本基础
程序的组成:
程序:算法+数据结构
数据:程序处理的目标
数据结构:相互之间存在一种或多种特定关系的数据元素的集合
算法:处理数据的方式
编程风格:
- 面向对象:把所有的操作都转化为对象的方式。
- 面向过程:步骤话解决问题
编程语言:
计算机:运行二进制指令
编程语言:人与计算机之间交互的语言
编程语言分类:
低级语言
机器语言:二进制0和1组成的序列,称为机器指令
汇编语言:用一些符号代替机器语言
高级语言
机器代码文件:0和1组合而成的二进制文件。
编译:编写的程序文件-->编译器(一个工具)-->机器代码文件-->执行文件
(编译:通过编译器转换成二进制可执行文件)
特点:所有代码统一进行编译,执行效率高
解释:编写的程序文件-->执行-->解释器-->机器代码
(解释:将文件中的一行行代码按顺序依次交给解释器,解释为二进制指令再进行执行)
特点:一行行代码依次进行解释和执行。需要把源码交给使用者
编程逻辑处理方式:
顺序、分支、循环
shell脚本
shell:面向过程、解释型语言(需要通过指定shell来将程序解释为计算机可以理解的语言)
shell脚本:符合一定格式的文本文件
特点:批量执行任务、减少误操作、提高效率
格式要求:
首行shebang(#!)机制
#!:翻译为shebang
shell脚本的创建:
- 创建文本文件
- 首行申明shell使用的解释器: #!
- 编写shell脚本相关内容
- 添加执行权限
#!SHEBANG
CONFIGURATION_VARIABLES
FUNCTION_DEFINITIONS
MAIN_CODE
执行shell脚本
命令执行的三种情况: 别名 --- 内部命令 -- 外部命令
外部命令执行:需要判断内存中是否存在,若不存在就到PATH变量的路径中寻找
shell脚本执行:
path/shell_name --- 路径/文件名
方法一:通过bash命令执行shell脚本
例如:
(1) bash filename
(2) cat filename | bash (可以实现把shell脚本放在服务器上,然后远程执行)
(3) bash < filename
方法二:通过添加执行权限,然后使用相对路径或者绝对路径的方法来执行shell脚本
chmod +x filename; path/filename
shell脚本错误调试
常见的错误分类:
语法错误:会导致后续的命令不继续执行
使用bash -n 检查是否错在错误的命令
命令错误:默认后续的命令还会继续执行
使用bash -x 来跟踪命令的执行过程。 判断是否存在语法错误
逻辑错误:不影响执行,但是输出结果不对
只能使用bash -x 检查
变量
shell中变量存储的不同类型数据都会被当成字符串处理。
变量类型:
- 内置变量 如:PS1,PATH,UID,HOSTNAME,$$,BASHPID,PPID,$?,HISTSIZE
- 自定义变量
静态语言和动态语言
- 静态编译语言:使用变量前,先声明变量类型
- 动态编译语言:不用事先声明,可随时改变类型
强类型和弱类型语言
- 强类型语言:不同类型数据操作,必须经过强制转换才同一类型才能运算
- 弱类型语言:语言的运行时会隐式做数据类型转换
shell:动态语言、弱类型语言
shell中变量的命令规则:
- 区分大小写
- 不能使用内置变量名和保留字
- 只能使用数字、字母和下划线(数字不能作为开头)
注意:不支持短横线 “ - ”,和主机名相反
变量定义和引用
- 普通变量:当前shell
- 环境变量:当前shell以及子进程
- 本地变量:当前shell中某个函数
变量赋值:变量名='值'
注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚 本结束,也会自动删除
变量引用:$name或${name}或反引号
- "$name " 弱引用,其中的变量引用会被替换为变量值(双引号)
- '$name ' 强引用,其中的变量引用不会被替换为变量值,而保持原字符串(单引号)
显示已定义的所有变量和函数: set
删除变量:unset 变量名
shell特殊变量
- 环境变量
- 位置变量
- 退出状态码变量
- 只读变量
环境变量:配置shell环境
- 子进程可以继承,父进程无法使用子进程的环境变量
- 一般在系统配置文件中使用
范例:查看某个进程的环境变量
- 使用pstree命令找到该进程的进程好
- cat /proc/进程号/enversion

变量声明:export name=Value或declare -x name=value
引用: $name或${name}
只读变量: readonly,常量。
位置变量:bash shell内置的变量
通过命令行将参数传递给shell脚本的参数
- $1...n: 对应指定参数的位置,如$1对应shell脚本第一个参数的位置。
- $0: 脚本名
- $*: 脚本所有参数,全部参数合为一个字符串($@ 脚本所有参数,每个参数为独立字符串)
- $#: 脚本参数个数
退出状态码变量:$?
进程执行以后,使用$?保存状态码,$?的取值范围:0-255
- 0 --- 执行成功
- 1-255 --- 执行失败
执行失败有很多种可能性,比如语法错误,文件没找到等。所以不同失败的状态码不一样。
自定义退出状态码: exit [num]
注意:
- 脚本中一旦遇到exit命令,脚本会立即终止;终止退出状态取决于exit命令后面的数字
- 如果exit后面无数字,终止退出状态取决于exit命令前面命令执行结果
- 如果没有exit命令,整个脚本的退出状态码取决于脚本中执行的最后一条命令的状态码
linux各种符号处理的优先级:
- 首先将命令拆成单词,
- 若为别名则替换为原始命令的定义。
- 若有花括号{}就把它展开
- 若有波浪符就用家目录替换
- 若有$()和` `就进行命令的替换
- 若有通配符就有符合要求的文件名替换
- 最后重定向
- 运行命令
shell脚本安全
set -e:如果其中一个命令错误,就中断执行
有时候会产生误杀,比如执行一条命令返回的状态码是非0
set -u: 当一个变量没有定义的时候就退出。避免变量不存在出现的问题。
Linux shell脚本基础的更多相关文章
- 详细介绍Linux shell脚本基础学习
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...
- Linux shell脚本基础学习详细介绍(完整版)二
详细介绍Linux shell脚本基础学习(五) Linux shell脚本基础前面我们在介绍Linux shell脚本的控制流程时,还有一部分内容没讲就是有关here document的内容这里继续 ...
- Linux shell脚本基础学习详细介绍(完整版)一
Linux shell脚本基础学习这里我们先来第一讲,介绍shell的语法基础,开头.注释.变量和 环境变量,向大家做一个基础的介绍,虽然不涉及具体东西,但是打好基础是以后学习轻松地前提.1. Lin ...
- Linux shell脚本 基础
一.shell中三个引号的用法 1.单引号:所见即所得 例如:var=123 var2='${var}123' echo var2 var2结果为${var}123 2.双引号:输出引号中的内容,若存 ...
- 阿里Linux Shell脚本面试25个经典问答
转载: 阿里Linux Shell脚本面试25个经典问答 Q:1 Shell脚本是什么.它是必需的吗? 答:一个Shell脚本是一个文本文件,包含一个或多个命令.作为系统管理员,我们经常需要使用多个命 ...
- Linux shell入门基础(六)
六.Shell脚本编程详解 将上述五部分的内容,串联起来,增加对Shell的了解 01.shell脚本 shell: # #perl #python #php #jsp 不同的脚本执行不同的文本,执行 ...
- 老李分享:《Linux Shell脚本攻略》 要点(一)
老李分享:<Linux Shell脚本攻略> 要点(一) 第一章:Shell起步基础 1.变量:在bash中,每一个变量的值都是字符串.无论你给变量赋值时,有没有使用引号,值都会以字符 ...
- linux ——shell 脚本
linux—shell 脚本 精简基础 2018/10/30 13 ...
- linux shell脚本相关知识
最近的项目中,有一个编写linux shell脚本的任务.由于之前不是很熟悉,在这个过程中遇到了很多困难,查找了很多资料,也收获了很多.下面是linux shell脚本中常用的知识总结. 1基础语法 ...
随机推荐
- Java学习day3
今天跟着b站up的视频学习了方法定义调用与重载,以及类的封装. Java中的方法与c++当中的函数类似,只是定义格式为: public static void 方法名(){ 方法体 } 上完课做实验的 ...
- SQL语言学习-DQL
DQL:查询表中的记录 * select * from 表名; 1. 语法: select 字段列表 from 表名列表 where 条件列表 group by 分组字段 having 分组之后的条件 ...
- k8s入门之pod(四)
pod是k8s项目中的最小编排单位,它是运行中的一组(一个或多个)容器,这些容器共享存储.网络.调度等资源,pod是一个逻辑概念,同一个名称空间下不同pod可以通过ip互相访问. 一.通过命令行方式管 ...
- 关于 background-image 渐变gradient()那些事!
大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...
- 攻防世界-MISC:a_good_idea
这是攻防世界高手进阶区的第十题,题目如下: 点击下载附件一,解压后得到一张图片,把图片放到kali用binwalk查看一下,果然包含了几个文件, 用命令把文件分离出来, 得到一个misc文件和一个压缩 ...
- Prim 最小生成树 图解
什么是生成树 子图:G=<V,E>,G'=<V', E'>,为两个图(V为点集,即图中点的集合,E为边集),如果V'是V的子集且E'是E的子集,则G'是G的子图. 如果V' ...
- Linux 多网卡bonding
bonding 将多块网卡绑定同一IP地址对外提供服务,可以实现高可用或者负载均衡.直接给两块网卡设置同一IP 地址是不可以的.通过 bonding,虚拟一块网卡对外提供连接,物理网卡的被修改为相同的 ...
- AliIAC 智能音频编解码器:在有限带宽条件下带来更高质量的音频通话体验
随着信息技术的发展,人们对实时通信的需求不断增加,并逐渐成为工作生活中不可或缺的一部分.每年海量的音视频通话分钟数对互联网基础设施提出了巨大的挑战.尽管目前全球的互联网用户绝大多数均处于良好的网络状况 ...
- PHP代码审计之SQL注入
代码审计之SQL注入 SQL注入攻击(SQLInjection),是攻击者在表单中提交精心构造的sql语句,改变原来的sql语句,如果web程序没有对提交的数据经过检查,那么就会造成sql注入攻击. ...
- Python版本共存、语法、变量和数据类型
python多版本共存 主要是把两个版本的python解释器的所在路径都加入环境变量当中,之后重新命名python解释器文件名称就好 先拷贝一个启动程序,在进行改名就好 python.exe pyth ...