一,脚本概述
(一)脚本三种处理逻辑
1,顺序执行:程序按从上到下顺序执行
2,选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行
3,循环执行:程序执行过程中需要重复执行多次某段语句(已知次数 已知条件 死循环)
(二)脚本概念
脚本简单理解 就是命令的集合
将要执行的命令按顺序保存到一个文本文件,给该文件可执行权限,可结合各种Shell控制语句以完成更复杂的操作。
(三)脚本应用场景
重复性操作
交互性任务
批量事务处理
服务运行状态监控
定时任务执行
(四)脚本的构成
1,解释器 (脚本是用什么语言写的) 可以不写
2, 注释 (解释语句的含义) 可以不写
3, 执行语句
(五)脚本执行的方法
1,使用解释器 bash (不需要权限)
2,使用路径执行(需要加执行权限)
当以路径执行,权限不够
加上执行权限,再此以路径执行
3,source 和.执行(不需要权限)
使用前两种方式执行脚本会开启子 bash 去执行
使用source 和点会影响当前的bash环境
所以推荐用bash 解释器执行
(六)想让脚本的路径可以补全
做一个软连接
(七)脚本的报错
1,命令错误
命令出错 不会影响下面命令的执行
2,语法错误
3,逻辑错误
想要猫,得到狗
(八)脚本出错检测
1,bash -x 把脚本的每一步都执行一遍
2,bash -n 检查语法
不在当前目录下加绝对路径
(九)脚本的错误预防(set -e set -u)
1,set -e 只要 出错立即停止
2,set -u 变量不存在不让执行
二,重定向 与 管道符
(一)重定向
1,重定向定义
重定向的意思就是,不输出到默认设备上,输出到你指定的位置(文件 其他输出设备)
2,重定向类型
类型 | 设备文件 | 文件描述编号 |
---|---|---|
标准输入 | /dev/stdin | 0 |
标准输出 | /dev/stdout | 1 |
标准错误输出 | /dev/stderr | 2 |
重定向类型 来源:
3, 将错误的和正确的一起重定向
例题:以下不能将正确和错误一起显示出来的是
[root@centos7 ~]#ls /data /xxx 1> /data/all.log 2>&1
[root@centos7 ~]#ls /data /xxx 2> /data/all.log 1>&2
[root@centos7 ~]#ls /data /xxx &> /data/all.log
[root@centos7 ~]#ls /data /xxx >& /data/all.log[root@centos7 ~]#ls /data /xxx 2>&1 1> /data/all.log
1代表 正确输入
2代表 错误输入
& 代表混合
[root@centos7 ~]#ls /data /xxx 2>&1 1> /data/all.log 不可以
(二)标准输入重定向
(三)多行重定向
Here Document 概述 使用 I/O 重定向的方式将命令列表提供给交互式程序或命令,比如 ftp、cat 或 read 命令。 HereDocument是标准输入的一种替代品, 可以帮助脚本开发人员不必使用临时文件来构建输入信息, 而是直接就地生产出一个文件并用作命令的标准输入。
三,shell 变量
(一)shell 变量基础
1,常见 Shell 变量的类型包括
自定义变量:由用户自己定义,修改和使用
预定义变量:Bash中内置的一类变量 shell 不能修改 规定好的变量 放在那里让你使用
环境变量:由系统维护,用于设置工作环境 当前目录 当前主机名啊 $PATH
只读变量:只可以读取不可以更改 只能不能修改 常量
位置变量:通过命令行给脚本传递参数
2,命名要求
-
区分大小写
-
不能使程序中的保留字和内置变量:如:if, for,hostname 命令 a=
-
只能使用数字、字母及下划线,且不能以数字开头,注意:不支持短横线 " - ",和主机名相反
-
不要使用内置的变量,使用英文尽量使用词义通俗易懂,PATH
-
大驼峰 StudentFirstName
-
小驼峰 studentFirstName
-
下划线 student_name
(二)自定义变量 具体介绍
1,定义自定义变量 调用自定义变量
取消变量:
unset 变量名
2,变量相关符号
2.1,双引号 弱引用 可以识别变量
2.2,单引号 强引用 不能识别变量
2.3,{ } 定义变量名的 范围
2.4, `` 反撇 调用命令的执行结果 和$()功能一样
2.5,必须要用单引号,但想要显示变量(两个单引号 )
2.6, 四个符号 灵活应用
如: 同时ping 192.168.91网段的 所有ip
3,变量与别名
变量在一定程度可以当做别名使用
4,变量追加值
5,交互的去定义变量 read -p
交互式的输入变量值,然后 使用变量
6,将自定义的变量全局生效 export
6.1 bash
bash:linux 桌面环境
bash作用: 输入命令bash 会进入当前bash的子bash 就是进入另一个桌面环境,当做出可能影响的操作时,直接exit 退出当前子bash 回到父bash
当你切换用户时 su - 和 su 之后的bash 都不是之前的子bash 都是新的bash
su - 和 su 区别:
su 不彻底 新用户 会继承老用户的 环境变量
6.2bash配置文件
一旦你登录 bash 环境 会读取以下四个文件 进行个性化配置
登录时进行操作,任何可以执行的命令都可以写进去
只对当前用户生效:
~/.bashrc ~/.bash_profile
对系统里的所有人生效
/etc/profile /etc/profile.d/*.sh
6.3 export
自定义的变量只能在当前bash 环境生效
想这个变量在所有的子(孙)bash 环境生效,加export(局部变量 变全局变量 )
7,整数变量的运算(4种写法)
运算符:
加法 +
减法 -
乘法 \ * (* 是乘法 \ 转义,指表示原来的意思)
除法 /
取余 (取模)%
% 的意思,是除了之后取余数,如 6 % 3 值为0
100 % 33 值为1
随机一个数(范围0到32767) % 33 值为0到32(不可能是33 33可以被整除)
7.1 expr
expr只能进行整数的运算
格式: expr 变量1 运算符 变量2 [运算符 变量3]
7.2 bc 计算机
bc 能用小数
7.3 let
7.4 变量名=$[运算]; echo $变量名
7.5 加入变量
8, 取随机数值 (RANDOM 与取余 % )
$RANDOM 这个变量取值范围:0-32767
(会在这个范围随机取数)
要求:取 1 到33随机数
RANDOM%33 可以得到0 到32的任意数值,因为0到32767 除以 33
余数只可能是0到 32
9,启用颜色
10,生成一个电脑基础信息的脚本
可以通过sz命令 把脚本放到别的计算机去执行
(三)环境变量具体介绍
1,环境变量定义
-
由系统提前创建,用来设置用户的工作环境
-
可以使用env查看环境变量
2,需要记住的常用环境变量
$USER 表示用户名称
$HOME 表示用户的宿主目录
$LANG 表示语言和字符集
$PWD 表示当前所在工作目录
$PATH 表示可执行用户程序的默认路径
3,环境变量注意事项
-
可以使子进程(包括孙子进程)继承父进程的变量,但是无法让父进程使用子进程的变量
-
一旦子进程修改从父进程继承的变量,将会新的值传递给孙子进程
-
一般只在系统配置文件中使用,在脚本中较少使用
4,环境变量的全局配置文件
配置文件位置在
/etc/profile如果修改此文件会作用于所有用户
~/.bash_profile 用户独立的配置文件,修改这个文件只作用于当前用户
(四)只读变量readonly
变量值不允许修改(重新赋值)的情况
无法使用 unset删除
最快方法重启
(五)位置变量
位置变量也称为位置参数,使用$1、$2、$3、...、$9 表示
就是字面意思, 根据脚本里的位置顺序,显示bash 脚本后对应的值
(六) 预定义(状态)变量
1,预定义变量 定义
-
$*:表示所有位置参数的内容看成一个整体返回 返回所有
-
$@:表示所有位置参数的内容分割成n份,每份作为一个独立的个体返回 返回所有
-
$?:表示前一条命令执行后的返回状态,返回值为 0 表示执行正确,返回任何非 0值均表示执行出现异常
-
$#:表示命令行中位置参数的总个数
-
$0:表示当前执行的脚本或程序的名称 当前脚本的名字
-
:当前bash的进程id
bash 帮你定义好了 拿来用就可以了,你不需要知道为什么,记住
2,\* 和@ 都表示所有位置参数
3,\* 和@ 的区别
$* 把a到z 看成一个整体
$@ a 到 z 各自是一个整体
echo "\*" 将所有项当成一个值 echo "@" 独立个体
echo "$#" 后面参数的个数
3.1实验认证
脚本3 是打印第一个位置参数
脚本1 和脚本2 的结果 都交给脚本3, 输出$1
两者结果不同
4,$? 表示前一条命令执行后的返回状态
只能是上一个命令 0是正确 非0 为不正确
5,$#:表示命令行中位置参数的总个数
6,$0:表示当前执行的脚本或程序的名称 当前脚本的名字
把脚本做软连接 会显示软连接的名字