目录
一、shell脚本概述:
shell是什么:shell介于人和计算机之间
人类有人类语言,计算机有计算机语言
翻译官:
shell是Linux系统中后台运行的一种特殊程序也可以理解 成一种特殊的软件,提供了用户与内核进行交互操作的 一种接口。(简单的说就是shell把人类的高级语言转换成二进制数据,让机器明白你的指令)
过程:用户发出指令,通过shell转换成二进制语言被内核识别,内核再调度相对应的硬件,做出相关操作。
shell脚本
脚本语言:扩建语言,动态语言,也是编程语言中的一种。主要用来控制软件应用程序
都是以文本形式保存,只有在被调用的时候,文本代码才会被解释或者编译,也就是执行
1、shell的类型:
cat /etc/shells
/bin/sh 淘汰了
/bin/bash 现在常用的也是linux默认的shell 管理员
/sbin/nologin
/usr/bin/sh
/usr/bin/bash 现在常用的也是linux默认的shell 普通用户
/usr/sbin/nologin
/bin/tcsh 基于tcsh,提供更多的扩展功能
/bin/csh 类c语言shell
使用的shell:/bin/bash
默认就是bash
查看用户使用的shell
/etc/passwd 查看用户信息
创建脚本:
默认格式以.sh结尾,约定成俗的习惯,表示shell脚本
2、shell脚本的作用:
- 自动化运维(配合定时任务执行)
- 批量化、重复操作可以通过脚本执行,减少人工的重复输入
- 减轻了管理员的工作量
- 提高了处理文件的速度
- 避免配置出错
3、shell脚本的组成结构:
- 声明解释器
- #表示注释,注释掉的代码不会被执行,而且是按行执行
- 脚本当中的语句,linux的可执行命令都可以做为shell脚本执行
- 脚本中的语句按照从上到下,依次按行执行
5、shell的执行方式:
- 赋权执行 赋执行权限
- 不赋权执行 (脚本调试)
不赋权执行:
- sh 脚本名,sh只在当前环境运行,并不涉及子shell环境切换
- source 脚本名,source新建一个shell继续执行,而且所有的执行结果都会保存在这个shell里面
source命令:点命令. 如. test.sh
是对刚刚修改的文件进行初始化操作。(文件的内容都是shell语句,都是可执行的命令)。执行source可以不需要重启,使更改的内容直接生效
赋权直接chmod 777 test.sh
赋权执行:
先给权限
在当前目录可以直接执行 ./first.sh
不再当前目录执行用绝对路径 /opt/fiest.sh
需要执行的脚本不能放在用户的家目录
最好放在opt目录中
结合定时任务写,必须要绝对路径
二、shell编程规范
1、标准输入、标准输出、标准错误输出
标准输入:键盘,文件编号是0,我们正常执行的命令结果。ls、cd/opt
标准输出:显示器,显示输出的结果
标准错误输出:显示器,显示错误的输出结果
2、重定向:
echo 123 > 123.txt
重定向输出:
> 将标准输出的内容保存到指定文件,会覆盖文件中的原有内容
>> 也是重定向输出,会在文件内容的尾部追加,不会覆盖文件原有内容
重定向错误输出:
- 只有错误的才会被保存,覆盖
2>> 尾部追加
混合输出:
&> 会覆盖原有内容
&>> 行后添加
重定向输入:<
3、变量
怎么在shell脚本中定义变量,以及shell脚本的变量类型,shell的运算符
变量:面向对象
对象的名称(变量名)
对象的属性(变量的值,对象的描述信息)
test=1
demo=2
1、变量的属性:
值的类型:
int:整数类型
string:字符串类型
布尔类型:true false
浮点类型:1.2.3.4.5.6
赋值声明方式:变量名=属性值
打印变量值:echo
2、变量的命名规范(自定义变量):
- 不要使用linux的系统命令作为变量名
如cd=ls
- 不要使用中文
- 不要使用特殊符号,作为变量名称的开头、
¥%#
可以使用_作为变量的开头
- 默认约定成俗规则:命名时用引文对照;学生 student,秒 second,计算机 computer
- 默认加上注释,变量名的引用保持前后一致,引用同一个变量前后保持一致
- 变量名不要以数字开头
工作中没有 a=1 b=2 格式
3、自定义变量:
在自定义变量中:” ” ‘ `
整数类型可以不加 ” 或者 ’ 赋值为字符串类型,最好加上引号
再给变量赋值时,单引号和双引号一样。不影响变量的数值
` 命令替换,先执行反撇号当中的命令,然后再把命令执行的结果赋值给变量
打印变量时,引号的作用: 这里不涉及反撇号
打印变量双引号和单引号机制不同
echo “$a” 弱引用 原变量的值不同
echo ‘$a’ 强引用 变量值将不再打印,就是$a 这个字符串。
避免出现歧义:保证一定能够正确的识别变量值
echo “$a”
echo “{a}”
4、变量赋值:
a=1 b=2
read命令的方式获取变量:
格式:read -p “提示信息” 变量名
灵活改变变量:
灵活赋值:
5、变量的作用范围:
默认情况下,新定义的变量只在当前的shell环境中生效。
想要整个shell环境都生效:要用全局变量
进入 /etc/profile 改配置文件
export 变量名=变量值
需要在一整套环境当中引用唯一且不需要变化的变量时,才会声明全局变量(属性唯一,且永远不变)
6、环境变量:
系统提前创建,用户也可以添加。设置用户的工作环境,配置系统行为,控制程序执行。
命令为什么能被识别:因为被事先添加到环境变量中了
用户级环境变量:
查看全局环境变量:env
查看用户环境变量:echo $PATH 就是特殊的全局变量 只对当前用户可见
预定义环境变量:系统预设,所有人可见,相当于全局变量
自定义的环境变量:特殊的全局变量,只对设置用户有效
添加全局变量:
常见的环境变量:
$USER 显示用户的名称
$HOME 用户的家目录
$PWD 表示当前所在的工作目录
$PATH 可执行用户程序的默认路径
7、位置变量:
又叫命令行参数,在脚本或者程序运行时,传递给他们的值,而且位置变量在脚本外部传递变量值。
$n 1-9: $1 $2 $3 $4 $5...$9
10以上的用{}表示: ${10} ${11}
从小到大按顺序依次执行
预定义变量:
编程语言或者shell脚本解释器提供的,不能修改的。只能根据需要进行自动设置或者更新
$* 和 $@:表示命令或者脚本需要处理的参数
$* 和 $@ 不加引号的表现一致,都会把参数分行处理
$* 加上引号,会把参数当成一行处理 “$*”
$#:会显示需要处理的参数个数
$?:表示前一条命令或者脚本执行之后的返回状态码,只有返回0,表示执行成功,所有非0去全部表示执行失败。也可以用在函数中,作为return的返回值
——只能反馈最近的上一次的命令
echo $? 查看上一次命令操作是否成功
shell脚本整数的运算方式:
运算符号 + - * / %(取余)
c=$(($a+$b))
c=$((12+5))
let c=12*5
c=$(expr 12+5) c=$(expr 12\*5)
i++:i=$(($+1)) 每一次都会自增1,先赋值,再加1
1 i=1 i<10 i++ 结果是1-9
i++ 先赋值,再加1,每次自增1
第一次:i=1
第二次:i=1+1=2
第三次:i=2+1=3
第四次:i=3+1=4
......
++i 先加,再赋值,也是每次增1
第一次:1=i
第二次:1+1=2=i
第三次:2+1=3=i
第四次:3+1=4=i
......
每次自加1:i++=$(($i=1))
每次自加2:i++=$(($i=2))
表示成:i+=2
i=0 i<100 i+=2 取0-100 自加2(每次取偶数)
i--:先赋值再减
--i:先减在复制
浮点数运算:
bc是shell自带的计算器
下面这种格式仅限正护士运算
awk
可以支持浮点运算,自动保留小数点