shell编写步骤:
1.编写脚本 vim first.sh
2.编写完成 测试脚本 bash -n first.sh
3.赋予权限 chmod +x first.sh
4.执行脚本 ./first.sh
ps shell脚本学习首先需要对linux的认识,系统命令及大体结构熟悉,能够熟练操作系统与搭建常见服务提供服务,才能够更好地去学习Shell编程。。。
变量:
内存空间,在引用一个数据或者数组的时候通过变量名来调用,该空间可以回收并在此分配到不同的数据存储,称为变量。
内存是编址的存储单元,在物理内存中每一个字节都有一个唯一的地址,通过某个唯一的地址则能找到对应的某个字节,程序在执行起来称为进程,进程的所有数据和指令都是位于内存中,在某个程序执行的过程中临时存储一些数据时,则需要用到变量,而这些数据中间可能会被改变的数据值,当某个数据被执行结束以后,该数据则被清除,重新把空间赋值给其他数据,所以该内存空间存储的量不断变化,这些变化的量都存储在一个不断改变其值的存储空间当中,而这个存储空间就是内存当中的某一段存储空间,如么如何能够找到某段存储空间的数值呢?根据内存地址则可找到,一般指的是起始地址,但是对于用户来说,要记录内存地址是非常困难,因为是十六进制的,因此会进程内部会有一个映射表,用变量名称(字符串)来标识某段内存地址,对于用户识别的是名称,对于计算机所识别的是一段内存的地址。
变量的存储:
在每一次的数据存储时,数据的容量大小都可能不一样,存储2 和 2000 占用的内存容量是不一样的,
例:存储字符10 在计算机最小存储单位为8bit,1和0两个字符需要16bit
存储数值10,十进制转换二进制等于1010,实际上占用4bit,但计算机最小存储单位为8字节,所以需要8bit
所以当赋值存储数据时,事先需要确定是当字符存储还是当数值存储,否则占用多少存储空间都无法断定,因此变量是有类型的
变量类型: 指定的是存储数据的存储格式,变量类型直接决定了数据的存储格式和长度
字符型:
数值型:
整形:
浮点形:带有小数点,例:12.25,实际上浮点形的存储方式是分开存放的,小数点前作为一个单位存放,小数点后也作为一个单位存放,而后存储小数点的位置
逻辑运算: 与、或、非、异或
1:真
0:假
与: 只要有一个为假,结果一定为假
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
1 & 1 = 1
或: 只要有一个为真,结果一定为真
1 || 0 = 1
0 || 1 = 1
0 || 0 = 0
1 || 1 = 1
非: 非假即真 非真即使假
!真 = 假
!假 = 真
异或:
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
1 | 1 = 0
不相同为1 相同为0
强类型:变量在使用前,一定需要声明变量的类型、甚至需要初始化(当申请内存空间后数据还没有存储时,则随机生成原始值,所以需要初始化再存放数据,一般数值初始化为零,字符串也初始化为NULL,相当于初始为NULL,默认初始值)也可以指定初始值
弱类型:变量在用时声明,不区分变量是数值还是字符,不需要声明,甚至不需要区分类型,如果不区分类型,一般默认为字符串
如果需要赋值变量为数值则需要使用 let VAR_NAME=VALUE
变量名称格式:
1、只能包含字母、数学和下划线,并且不能以数字开头
2、不应该与系统中已有的环境变量生命重名
3、最好做到见名知义
变量赋值:VAR_NAME=VALUE
引用变量:${VAR_NAME},又称变量替换,引用的是变量名称,结果得到的是变量中的数据值,在引用变量时,在没有导致变量名称混淆的情况下可以省略括号,否则需要加上括号
bash 变量类型:
环境变量:作用域为当前shell进程及其子进程
赋值变量方式:(又称导出变量)
1、export VAR_NAME=VALUE
2、VAR_NAME=VALUE
export VAR_NAME
本地变量:作用域为整个bash进程都可使用,当该进程结束则不可使用
赋值变量方式:
VAR_NAME=VALUE
局部变量:作用域只对当前的代码段有效
赋值变量方式:
local VAR_NAME=VALUE
位置变量:用于引用脚本的参数,
引用方式:在脚本中以 VAR_NAME=$1 VAR_NAME=$2 赋值,在执行脚本同时以空格分隔跟上参数,该参数则为脚本中以 VAR_NAME=$1 VAR_NAME=$2 的变量,第一个参数为$1的变量数据值,第二个参数则为$2 的变量数据值,可以指定多个,脚本的执行参数与脚中的位置变量$N 一一对应
shift 组合位置变量用法,shift 命令用于轮调变量,同一个位置变量,引用多个参数
shift N 表示轮调N个变量,shift 2 例:1 2 3 4 5 ,则1 3 5
例:
#!/bin/bash
echo $1
shift
echo $1
shift
echo $1
# ./shift.sh 1 2 3
特殊变量:bash内置的一种变量,用于保存某些特殊数据的变量,甚至会把特殊变量称为系统变量
$?:上一个命令的执行状态返回值
程序执行,可能有两类返回值:
程序执行结果
程序状态返回代码(0-255)
0:表示正确执行
1-255:表示错误执行,1,2,127为系统预留
echo $? 可以查看上一个命令的执行状态返回值
$# :脚本的参数数量
$* :脚本的参数列表
$@ :脚本的参数列表
$$ :脚本的PID
$2 :脚本的第2个参数
$0 :脚本的名字
本地变量:变量是在某个程序中使用的,或程序在运行过程中用来存储数据,而bash则是一种特殊的程序,在运行起来的时候就可以在bash内部声明变量,那么bash在内部声明变量,这个变量是与bash进程相关的,如果bash进程结束时,那么相关的变量则结束,所以变量一定是进程的变量,因此可以在shell中直接定义变量,随时用,随时定义,不需要定义数据的类型,那么在bash中再打开bash子shell时,此时在父shell定义的变量则不生效,原因是在不同的shell中,实际上是两个不同shell的进程,所以在父shell定义的变量,在子shell中是得不到的,虽然在界面上所见到的一样,但是在机器内部是完全不同
脚本在执行时会启动一个当前shell的子shell进程:
命令行中启动的的脚本会继承当前shell的环境变量
系统自动启动的脚本(非命令行启动)则需要自我定义需要的环境变量
撤消变量:
在赋值变量时,实际上是set VAR_NAME=VALUE,只是set可省略
unset VAR_NAME 即可撤消变量
查看当前shell中的变量:
set 即可查看当前shell中的变量,包括环境变量和本地变量
查看当前shell中的环境变量:
printenv
env
exprot
添加变量中的数据:
例:
VAR_NAME=$VAR_NAME:VALUE 添加数据到原有变量数据后
VAR_NAME=VALUE:$VAR_NAME 添加数据到原有变量数据前
添加PATH环境变量:
export PATH=$PATH:/uer/local/mysql/bin 添加/uer/local/mysql/bin路径到PATH环境变量路径后面
export PATH=/uer/local/mysql/bin:$PATH 添加/uer/local/mysql/bin路径到PATH环境变量路径前面
脚本:命令的堆砌,按照实际的需要结合命令流程控制机制实现源程序
用文本编辑器编辑一个文本,并以.sh结尾
当脚本编写完成时,系统内核是不能执行的,因为系统内核无法理解,系统内核只能够理解ELF格式的文件,但编写的脚本是ASCII格式的,所以需要在脚本中指定执行魔数
在脚本的第一行需要指定脚本的执行魔数(shebang )
以#!开头,后面跟上解释器的路径
#! 表示指定魔数(shebang )
#!/bin/bash 注:/bin/bash必须是个可执行解释器程序的路径
当脚本在执行时,把脚本提交给内核,内核执行发现错了,不能执行,但内核会发现脚本里面有执行魔数,则会理解该脚本是什么格式,而后则会根据指定的执行魔数路径启动相对应的解释器去解释脚本中的命令并执行,在过程中间会出现一个错误,而这个错误由内核进行处理,而处理机制则依赖这个魔数
脚本在执行时还需要有执行权限
chmod +x filename.sh
脚本在没有执行权限时执行
bash filename.sh 明确指定bash的脚本,使用bash解释器执行脚本,此时filename.sh并不是执行条件,只作为bash命令的参数执行
脚本的执行方式:
1、把脚本所在的路径加入PATH环境变量中
2、指定路径执行
绝对路径
/dir1/dir2/dir/filename.sh
当前目录
./filename.sh
本文来自学神1705班班长关民宗原创改编