作用与应用场景
用途
- 自动化常用命令
- 执行系统管理和故障排除
- 创建简单的应用程序
- 处理文本或文件
应用场景
- 重复性操作
- 交互性任务
- 批量事务处理
- 服务运行状态监控
- 定时任务执行
常见的shell
查看/etc/shells,里面是linux包含的shell
![](/i/l/?n=22&i=blog/2964633/202210/2964633-20221020134538497-1940212039.png)
bash是大多linux版本默认的shell
基本结构
- 脚本申明(申明解释器) :第一行开头 “#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来执行。还有其他类型的解释器,比如 #/usr/bin/python、#!/usr/bin/expect 。
- 注释信息: 以“#”开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行。
- 可执行语句: 如echo命令,用于输出“ ”之间的字符串。
![](/i/l/?n=22&i=blog/2964633/202210/2964633-20221020134557276-1396928926.png)
shell脚本的执行
1、指定路径去执行文件,文件需要有执行权限。
chmod +x AAA.sh
绝对路径:/root/mzs/AAA.sh
相对路径:./AAA.sh
2、指定解释器去执行(bash 脚本名),不需要执行权限。
bash 脚本路径
sh 脚本路径
source 脚本路径(source可以用 . 代替)
source命令是一个内置的shell命令,用于从当前shell会话中的文件读取和执行命令。source命令通常用于保留、更改当前shell中的环境变量。简而言之,source一个脚本,将会在当前shell中运行execute命令。
sh,bash、绝对路径、相对路径 执行脚本时,会创建一个子shell环境,并在这个子shell环境中执行脚本。
source和 . 执行脚本时,会在当前shell环境中执行脚本
错误调试
- 命令错误: 命令错误不会影响接下来的命令,之后的命令会继续执行。
- 语法错误: 会导致后续的命令不执行。造成脚本中一部分命令已执行,一部分未执行。
- 逻辑错误: 执行后的效果不是自己想要的。需要自己去排查
bash -n 脚本名称 //只检查语法错误,不真正执行脚本。定位的错误行可能不准确。
bash -x 脚本名称 //显示每个命令的执行过程,方便发现逻辑错误
重定向与管道操作
交互式硬件设备
标准输入:从该设备接收用户输入的数据 /dev/stdin 0
标准输出:通过该设备向用户输出数据 /dev/stdout 1
标准错误:通过该设备报告执行出错信息 /dev/stderr 2
重定向操作
类型 | 操作符 | 用途 |
重定向输入 | < | 从指定的文件读取数据,而不是从键盘输入 |
重定向输出 | > | 将输出结果保存到指定的文件(覆盖原有内容) |
重定向追加 | >> | 将输出结果追加到指定的文件尾部 |
标准错误输出 | 2> | 将错误信息保存到指定的文件(覆盖原有内容) |
标准错误追加 | 2>> | 将错误信息追加到指定的文件中 |
混合输出 | &> | 将错误输出、标准错误的内容保存到同一个文件中 |
管道符
x1 | x2 链接多个命令,把命令x1的结果作为命令x2的操作对象
如果管道符合右边是一定需要执行对象的命令,则管道符号 后面要有 xargs 命令来传递执行参数 (x1 | xargs x2)
shell变量
自定义变量
sheLl脚本给变量赋值的方式
变量名=变量值
例:name=1
查看变量的值:
echo &变量名
unset可以取消变量 例 :unset name
赋值时使用引号
双引号" ":会把引号的内容当成整体来看待。强引用,识别变量,允许通过$符号引用其他变量值。
单引号' ':会把引号的内容当成整体来看待。弱引用,禁止引用其他变量值,单引号内的内容都会被认为是普通字符。
反撇号` ` 和 $() :调用命令执行后输出的结果。如果存在嵌套,不能使用反撇号。
花括号{ } :定义变量范围。 echo <span class="katex"><span class="katex-mathml">color{color}<span class="katex-html"><span class="base"><span class="strut"><span class="mord"><span class="mord mathnormal">c<span class="mord mathnormal">o<span class="mord mathnormal">l<span class="mord mathnormal">o<span class="mord mathnormal">r{price}
![](/i/l/?n=22&i=blog/2964633/202210/2964633-20221020135100520-1807862780.png)
read命令
一:read -p “提示信息” 变量名
echo $变量名
二:在脚本中编写,在命令行实现read获取
整数变量的运算
expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串
![](/i/l/?n=22&i=blog/2964633/202210/2964633-20221020135210961-312760702.png)
运算符:+ 加法、- 减法、* 乘法、/ 除法、% 取余
$( )和反撇号,可以调用命令的执行结果。
![](/i/l/?n=22&i=blog/2964633/202210/2964633-20221020135311079-1352505018.png)
小数运算(浮点数运算)
bc计算
echo "浮点运算表达式" | bc
awk计算
awk "BEGIN{print 算术表达式}"
特殊的shell变量
环境变量
由系统提前创建,用来设置用户的工作环境
配置文件:/etc/profile(全局生效)、~/.bash_profile(当前用户环境)
常见环境变量
env PATH HOME PWD USER
使用 env 命令可以查看到当前工作环境下的环境变量
变量USER表示用户名称,
HOME表示用户的宿主目录,
LANG表示语言和字符集,
PWD表示当前所在的工作目录,
变量PATH表示可执行程序的默认搜索路径
(已经将该目录添加到路径环境变量中,目录内的所有具有执行权限的文件,都可以在当前环境任何目录中执行)
只读变量
用于变量值不允许被修改的情况
readonly 命令设置只读变量
只读变量不可以重新赋值
位置变量
当执行命令行操作时,第一个字段表示命令名或脚本程序名,其余的字符串参数按照从左到右的顺序依次赋值给位置变量。
n:n为数字,n:n为数字,n:n为数字,0代表命令本身,1~9代表第一个到第九个参数,十以上的参数需要使用大括号表示,比如第十个参数为 ${10}
![](/i/l/?n=22&i=blog/2964633/202210/2964633-20221020135455190-1234865522.png)
预定义变量
$#:表示命令行中位置参数的个数,传递到脚本的参数个数
@:与@:与@:与*相同,@以"@以"@以"1" “2 " … " 2" … "2"…"n” 的形式输出所有参数
$?:显示上一条命令的退出状态;0表示没有错误,其他任何值表明有错误
$0:脚本本身
日期
date +%F显示现在日期
date +%Y -%m-%d 年月日
date +%T 显示时间 HMS几点几分几秒
-%H 为小时
%w 周几
date -d “-1day” 一天之前
date -d “1day” 一天之后
![](/i/l/?n=22&i=blog/2964633/202210/2964633-20221020135529377-1723612997.png)