1. shell脚本编程概述
基本概念
-
将要执行的命令按顺序保存到一个文本文件;
-
给该文件可执行权限;
-
可结合各种Shell控制语句以完成更复杂的操作;
2. shell的作用
Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。 常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符 等方面会存在一些区别。
可通过/etc/shells 文件了解当前系统所支持的 Shell 脚本种类
3. shell脚本的用途
-
将简单的命令组合完成复杂的工作,自动化执行命令,提高工作效率。
-
减少手工命令的重复输入,一定程度上避免人为错误。
-
将软件或应用的安装及配置实现标准化。
-
用于实现日常性的,重复性的运维工作,如:文件打包压缩备份,监控系统运行状态并实现告警等。
3.1 shell脚本的组成
1. 脚本申明(解释器):第一行开头“#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。
2. 注释信息:以#开头的语句表示为注释信息。
3. 可执行语句:比如echo命令用于输出“ ”之间的字符串。
执行结果:
3.2 脚本执行的逻辑及方法
脚本执行逻辑
- 顺序执行:程序按从上到下顺序执行
- 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
- 循环执行:程序执行过程中需要重复执行多次某段语句
脚本执行方法
1. 直接调用shell解释器加上脚本名字 bash脚本名(不需要加上权限)
2. 路径/脚本 (需要权限)
指定路径方式执行有两种,一种是绝对路径的方式去执行,一种是相对路径的方式去执行(但是执行的前提一定是该脚本文件拥有执行的权限!)
(相对路径执行)
(绝对路径执行)
3. source(.)脚本名字 (不建议,会直接修改当前bash)
4. 将脚本文件放入$PATH中目录的其中一个目录,直接输入脚本名执行
将当前文件做个软连接放入或者使用cp复制到 /usr/local/bin目录下
直接输入脚本名执行脚本
4. 脚本错误
1.命令错误 (不会影响接下来的命令执行,但本条命令不执行)
2. 语法错误 (执行不了,直接影响脚本无法正常运行)
3. 逻辑错误 (只能自己去筛查代码的正确)
检查脚本错误
bash -x (模拟执行发现错误)
bash -n (可检查出语法错误)
关于set
set -e 脚本出现错误立即停止
set -u 变量不存在不让执行
5. 重定向与管道符
5.1 重定向
类型 | 设备文件 | 文件描述编号 | 默认设备 |
---|---|---|---|
标准输入 | /dev/stdin | 0 | 键盘 |
标准输出 | /dev/stdout | 1 | 显示器 |
标准错误输出 | /dev/stderr | 2 | 显示器 |
-
标准输入:从该设备接收用户输入的数据
-
标准输出:通过该设备向用户输出数据
-
标准错误:通过该设备报告执行出错信息
重定向的意思就是 ,不输出到默认设备上,输出到你指定的位置。
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | 1> | 将输出结果保存到指定的文件(覆盖原有内容) |
>> | 将输出结果追加到指定的文件尾部 | |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
2>> | 标准错误输出结果追加到指定的文件尾部 | |
混合输出 | &>无论对错都可以重定向 | 将标准输出、标准错误的内容保存到同一个文件中 |
实例
重定向输入与输出修改密码
覆盖追加
混合输出:
5.2 管道符
管道符 |
将左侧的命令输出结果,作为右侧命令的输入(处理对象)可以 叠加使用
6. echo命令:打印输出内容
选项 | 作用 |
-n | 不追加换行 |
-e | \b 退格 |
\c 抑制更多的输出 | |
\n 换行 | |
\t 横向制表符 | |
\v 纵向制表符 |
echo -n
echo -e \b
echo -e \n
6. 变量
6.1 变量的定义
Shell脚本的变量是什么?
变量是计算机语言中能储存计算结果或能表示值的抽象概念。保存将来会变化的数据,即使数据变
化,直接调用变量即可。
Shell 变量用来存放系统和用户需要使用的特定参数(值),而且这些参数可以根据用户的设定或
系统环境的变化而相应变化。通过使用变量,Shell 程序能够提供更加灵活的功能,适应性更强。
6.2 变量的类型
自定义变量:由用户自己定义、修改和使用
特殊变量:环境变量,只读变量,位置变量,预定义变量
环境变量:由系统维护,用于设置工作环境 (env可以看到所有)
只读变量:只可以读取不可以更改
位置变量:通过命令行给脚本传递参数
预定义变量:Bash中内置的一类变量,不能修改 有些规定好的变量 放在那里让你使用
环境变量
使用 env 命令可以查看到当前工作环境下的环境变量
配置文件:/etc/profile(全局生效)、~/.bash_profile(当前用户环境)
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
一般只在系统配置文件中使用,在脚本中较少使用
只读变量
变量值不允许修改(重新赋值)的情况
无法使用unset删除
最快方法重启
位置变量
- 当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
- $n: n为数字,$0代表命令本身,$1- $9代表带一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为${10}
6.3 变量的使用
设置变量
变量名=变量值(两边没有空格)
调用变量
echo$变量名
删除变量
unset 变量名
重新定义变量
变量名=变量名
追加变量
变量名+=变量值
6.4 赋值时使用符号
-
双引号:允许通过$符号引用其他变量值(变量在双引号中可以识别,弱引用)
-
单引号:禁止引用其他变量值, $视为普通字符 (变量单引号不被识别,强引用)
-
反撇号:命令替换,提取命令执行后的输出结果,代表引用命令结果,效果等于$()
-
{}:定义变量名范围(一定不会错)
-
echo $$显示当前bash环境,pid号。
-
定义变量时中间有特殊字符,如空格,可以使用单引号或双引号
7. read -p
从键盘输入的内容变成变量
8. 预定义变量
$? | 代表上一次命令执行结果是否正确,0是正确,非0是错误 |
$0 | 当前执行的脚本名字 |
$$ | 当前bash的pid |
$# | 代表位置参数总个数 |
$* | 代表返回所有参数(所有参数当成一个整体返回) |
$@ | 代表返回所有参数 (每个参数都是一个独立的个体返回) |
9. 整数的运算
expr只能进行整数的运算
格式: expr 变量1 运算符 变量2 [运算符 变量3]
运算符:
加法 +
减法 -
乘法 \ *
除法 /
取余 (取模)%
(1) let var=算术表达式
let sum=1+2
sum=1+2
(2) $((var=算术表达式)) 和上面等价
((sum=1+2))
echo $sum
(3) var= $[算术表达式]
(4) var=$(expr arg1 arg2 arg3 ...)
(5) var= `expr arg1 arg2 arg3 ...`
(6) echo '算术表达式' | bc
这里举几例