Shell脚本基础
1.shell脚本的概念
将要执行的命令按顺序保存到一个文本文件
给该文件可执行权限
可结合各种shell控制语句以完成更复杂的操作
2.shell脚本应用场景
重复性操作
交互性任务
批量事务处理
服务运行状态监控
定时任务执行
.....
3.shell的作用
命令解释器,“翻译官”
介于系统内核与用户之间,负责解释命令行
用户登录后默认使用的shell程序,一般为 /bin/bash
不同shell的内部指令,运行环境等会有所区别
通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类
查看当前的系统支持的shell
bash:基于gun的框架下发展的shell
csh:类似c语言的shell
tcsh:整合了csh提供了更多功能
sh:已经被bash替换
nologin:让用户无法登录
4.shell脚本的构成
① 解释器 (脚本是用什么语言写的)
第一行开头 #!/bin/bash 表示此行以下的代码语句是通过/bin/bash程序来解释执行。
是默认的解释器,还有其他类型的解释器,#!/bin/python #!/bin/expect
②注释 (解释语句的含义)
以#开头的语句表示为注释信息 # 注 释
③ 执行语句
比如echo命令用于输出“ ”之间的字符串
5.如何执行脚本
①使用路径执行 (需要加执行权限)
②直接使用解释器 (不需要权限)
③source和 . 执行 (不需要权限)
使用前两种方式执行脚本会开启子bash去执行,一般用这两种
使用source和点 会影响当前的bash环境
6. 脚本错误调试
①命令错误
命令出错不会影响接下来的命令继续
②语法错误
会影响接下来的命令继续
③逻辑错误
只能自己去筛查
bash -n 脚本名称 (不在当前目录下加绝对路径) 检查语法错误
bash -x 脚本名称 (不在当前目录下加绝对路径) 逻辑错误
总结:脚本错误常见的有三种区别
命令错误:默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行
语法错误:会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
逻辑错误:只能使用 bash -x 进行
在脚本前面加上set -e,表示脚本中如果出现错误,立即停止
7. 重定向与管道符
重定向: 不输出到默认设备上,输出到你指定的位置
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
这些设备在/dev/目录下
交互式硬件设备
标准输入:从该设备接收用户输入的数据
标准输出:通过该设备向用户输出数据
标准错误:通过该设备报告执行出错信息
重定向操作
类型 | 操作符 | 用途 |
---|---|---|
重定向输入 | < | 从指定的文件读取数据 |
重定向输出 | > | 将标准输出结果保存到指定的文件,并且覆盖原有文件 |
>> | 将标准输出追加到指定的文件的尾部,不覆盖原有内容 | |
标准错误输出 | 2> | 将错误信息保存到指定文件,并且覆盖原有文件 |
2>> | 将错误信息追加到指定文件的尾部,不覆盖原有内容 | |
混合输出 | &>和2>&1 | 将标准输出,标准错误保存到同—文件中 |
多行重定向
多行重定向通常用于将多行文本内容写入文件或从文件读取
语法:命令 > 文件名 <<自定义标记符 或 : 命令 <<自定义标记符 > 文件名
管道符
将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用
管道符左边的命令一定要有标准输出
管道符右边的命令一定要有接收标准输入
在这个命令中,cat /etc/passwd 列出文件内容,然后通过管道符将输出传递给 grep root。grep 命令会过滤出包含root字符串的行。
8.变量
Shell 变量用来存放系统和用户需要使用的特定参数(值)
(保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境都使用到 “变量”的概念)
这些参数可以根据用户的设定或系统环境的变化而相应变化
程序能够提供更加灵活的功能,适应性更强
常见 Shell 变量的类型包括:
自定义变量:由用户自己定义,修改和使用
预定义变量:Bash中内置的一类变量 不能修改 规定好的变量 放在那里让你使用
环境变量:由系统维护,用于设置工作环境 当前目录 当前主机名 $PATH
只读变量:只可以读取不可以更改
位置变量:通过命令行给脚本传递参数
系统内置变量:PATH,UID,HOSTNAME,USER
命名要求:
区分大小写
不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
大驼峰 StudentFirstName
小驼峰 studentFirstName
下划线 student_name
①自定义变量
变量名命名规则:由字母或下划线打头,不允许数字开头,后面由字母、数字或下划线组成,并且大 小写字母意义不同。在使用变量时,在变量名前加$
{} 可以定义变量的范围,确定变量的字符范围
“”(双引号) 可以识别变量
' '(单引号) 不可以识别变量
`` (反引号)可以调用命令的结果作为变量值 $(命令)也可以
命名格式为:变量名=变量值
变量可以使用命令进行追加:变量名+=需要追加的变量值
可以使用unset命令删除变量 :unset 变量名
也可以通过修改配置文件 /etc/profile 去自定义变量
添加后重新执行下文件
vim /etc/profile
还可以通过交互的方式自定义变量
read -p “提示信息” 变量名
②预定义变量
Shell在启动时就已经存在的变量,由系统自动初始化,具有特定含义和用途
$HOME 当前用户的家目录路径。
$PATH 用于查找可执行文件的路径列表。
$PWD 当前工作目录(Present Working Directory)
env命令可查看当前系统有哪些预定义变量
③环境变量
环境变量是一种特殊的预定义变量,不仅在当前Shell会话中可用,还会被所有子进程继承。
当前shell环境中定义的变量是无法自动被其它子进程继承的
需要通过export命令去赋予
④只读变量
通过readonly 命令来声明位置变量
只读变量不能更改或取消设置,这是bash中只读变量的一个特性
bash手册: declare -r (与readonly相同) -r 使名称成为只读的
这样,就不能通过后续赋值语句或unset为这些名称赋值
(只能重启shell环境来进行删除)
⑤位置变量
从命令行传递给脚本或函数的参数
每个参数都有一个编号,从 $0 开始,而 $1、$2、$3 等依次对应第一个、第二个、第三个参数...
$0是一个特殊变量,它代表脚本的文件名
⑥特殊变量
在预定义变量中,还存在一些特殊变量,比如在之前说到的$0就是一种特殊变量
$* 代表一个整体,把所有位置参数当成整体返回
$@ 代表独立个体,把所有位置参数当成个体返回
$? 上一条命令的执行结果是否成功。正确为0,返回任何非0值为异常
$# 代表位置参数个数
$0 代表当前脚本的名称
$$ 当前bash的pid
9.整数的运算
expr只能进行整数的运算
格式: expr 变量1 运算符 变量2 [运算符 变量3]
运算符:+加法 、-减法 、*乘法、 /除法 、%取余(取模)
expr 变量 + 变量 进行运算
定义变量时使用[]运算
使用(( ))进行运算
使用let运算
使用管道符给bc运算(可以运算小数)
i++
i++和++i之间的区别(i++ 是先赋值给j后再加 ++i是加后再赋值)
随机取余