1.shell脚本基础
1.1 shell的作用
Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当
了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执
行的操作传递给内核执行,并输出执行结果。
常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符
等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。
查看本机的shell信息
查看当前的系统支持的shell
1.2linux中常见的shell
- bash:基于gun的框架下发展的shell
- csh:类似c语言的shell
- tcsh:整合了csh提供了更多功能
- sh:已经被bash替换
- nologin:让用户无法登录
bash (/bin/bash)是目前大多数Linux 版本采用的默认shell
1.3shell脚本的本质
shell脚本的本质:命令的集合,命令的本质是程序,那么shell脚本的本质是程序;人类写了一个命令的集合,用bash这个软件,将命令交给硬件去执行;
shell脚本的特点:虽然linux一切皆文件,但是习惯还是将脚本以".sh"结尾,vim编辑器会给脚本中的命令
1.4shell脚本用途
- 将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率
- 减少手工命令的重复输入,一定程度上避免人为错误
- 将软件或应用的安装及配置实现标准化
- 用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等
1.5脚本执行逻辑及执行方式
1.51脚本执行逻辑
- 顺序执行:程序按从上到下顺序执行
- 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
- 循环执行:程序执行过程中需要重复执行多次某段语句
1.5.2脚本执行方式
使用指定的shell解释器:(不需要脚本有执行权限)
会重新加载一个子bash环境去执行,不会影响当前bash环境变量值,常使用。
- 使用路径执行,需要权限
绝对路径。如:/data/test.sh
相对路径。如:./test.sh
③使用 “source 脚本名” 或 “ . 脚本名”执行脚本,不需要权限
①和②执行方式不会影响当前环境中bash设置,会开启一个全新的bash环境执行脚本
③不推荐使用,不会启动子shell环境,会影响当前bash环境中的配置
1.6脚本错误调试
1.命令错误
命令出错不会影响接下来的命令继续
hostname
echo 'finsh'
2.语法错误
会影响接下来的命令继续
echo "hello world"
hstname
cat > /data/kgc.tx <<EOF
123
123
EOF
echo "ni hao"
3.逻辑错误
只能自己去筛查
查代码的正确
bash-n 脚本名称 (不在当前目录下加绝对路径)
检查语法错误
bash-x脚本名称 (不在当前目录下加绝对路径) 逻辑错误
#将脚本的所有语句执行一遍,
总结:脚本错误常见的有三种区别
- 语法错误,会导致后续的命令不继续执行,可以用bash -n 检查错误,提示的出错行数不一定是准确的
- 命令错误,默认后续的命令还会继续执行,用bash -n 无法检查出来 ,可以使用 bash -x 进行观察
-
逻辑错误:只能使用 bash -x 进行
命令错误调试:
在脚本的前面输入 `set -e` ,一旦出错立即停止
bash -n 脚本名称 //只检查语法错误,不真正执行脚本。定位的错误行可能不准确。
bash -x 脚本名称 //显示每个命令的执行过程,方便发现逻辑错误
1.7重定向与管道符
1.71重定向
类型 | 设备文件 | 文件描述编号 | 默认设备 |
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
交互式硬件设备
- 标准输入:从该设备接收用户输入的数据(echo “123” |passwd --stdin xueyin)
- 标准输出:通过该设备向用户输出数据 (ls /opt)
- 标准错误:通过该设备报告执行出错信息 (ls xxxxxx)
重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置(文件 其他输出设备)
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
| >> | 将输出结果追加到指定的文件尾部 |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | 标准错误输出结果追加到指定的文件尾部 | |
混合输出 | &>无论对错都可以重定向 | 将标准输出、标准错误的内容保存到同一个文件中 |
重定向输入
重定向输出覆盖和追加
第一种,/dev/pts改变输出的终端显示器
第二种:>覆盖
第三种:>>追加
1.72管道符
管道符 |
将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用
格式:cmd1 | cmd2
2.变量
变量来源于数学,是计算机语言中能储存计算结果或能表示值的抽象概念。
保存将来会变化的数据,即使数据变化,直接调用变量即可,各种 Shell 环境中都使用到了“变量”的概念。Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。
变量基础以及常见的shell变量的类型
变量有5种类型:①自定义变量(自己定义的)、②环境变量(这是系统维护的,如PATH等)、③只读变量、④位置变量、⑤预定义变量
关于自定义变量的命名要求:需要区分大小写、不能使用程序中的保留变量名称,只能使用数字、字母、下划线,且不能以数字开头,注意不支持短横线“-”
命名要求
区分大小写
- 不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=
- 只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 “ - ”,和主机名相反
- 不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
- 大驼峰 StudentFirstName
- 小驼峰 studentFirstName
- 下划线 student_name
name='value'
变量名=变量值
直接字串:name='root'
变量引用:name="$USER"
命令引用:name=`COMMAND` 或者 name=$(COMMAND)
注意:变量赋值是临时生效,当退出终端后,变量会自动删除,无法持久保存,脚本中的变量会随着脚本结束,也会自动删除
特殊符号
大括号{ }
{ }确定的变量起始结束的范围 ,只要有变量就加
" "弱引用可以识别变量
' '强引用不识别 变量
` `反撇 调用命令的执行结果 效果与 $()相同
整数运算
expr只能进行整数的运算
格式: expr 变量1 运算符 变量2 [运算符 变量3]
运算符:
加法 +
减法 -
乘法 \ *
除法 /
取余 (取模)%
let var=算术表达式
((var=算术表达式)) 和上面等价
变量1=`expr 变量2 运算符 变量3`(注意空格)
使用反撇号调用expr的运算结果,给变量赋值
变量1=$(expr 变量2 运算符 变量3)(注意空格)
使用$()调用expr的运算结果,给变量赋值
环境变量
常用的环境变量,这些都是由系统定义的
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
环境变量:
- 可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
- 一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
- 一般只在系统配置文件中使用,在脚本中较少使用
每开一个窗口就会新加载一个bash,在当前bash下输入bash,就会生成一个子bash,关于环境变量,子bash不会继承父bash的变量值,除非父bash加上export进行变量申明
环境变量的全局配置文件
配置文件位置在
/etc/profile如果修改此文件会作用于所有用户
~/.bash_profile 用户独立的配置文件,修改这个文件只作用于当前用户
可以用来长期变更或设置环境变量
[root@host1:~# ]vim /etc/profile
.....................省略到行末添加
export PATH=$PATH:/root
[root@host1:~# ]source /etc/profile
source立即生效或 .
预定义变量
bash 帮你定义好了 拿来用就可以了,你不需要知道为什么,记住
- $*:表示所有位置参数的内容看成一个整体返回 返回所有
- $@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
- $?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
- $#:表示命令行中位置参数的总个数
- $0:表示当前执行的脚本或程序的名称 当前脚本的名字
- $$:当前bash的进程id
- $!: 后台
- 任务最后一个id
$? 返回上一次的执行结算,0是正确,非0是错误
$$ 输出当前bash的pid
$0 表示脚本的名称
$# 表示位置参数的总个数
位置变量
位置变量也称为位置参数,使用$1、$2、$3、…、$9 表示
只读变量
变量值不允许修改(重新赋值)的情况
无法使用 unset删除
最快方法重启