什么是脚本?
“脚本”这个词来自话剧舞台。脚本执行就好像戏剧里的演员在“演绎”已经写好的剧本,按照剧情验出来呈现给观众。 脚本程序在执行时,则是由系统的一个解释器,将其一条条的翻译成机器可识别的指令,并按程序顺序执行,并将执行结果呈现给人类。
人类的高级语言也是多种的 汉语 韩语 日语 英语等,去不同的国家 需要说不同的语言进行沟通一样,那不同场景需要选择不同的脚本语言来编写,脚本也需要有一个解释器来执行,脚本的运行环境叫作“解释器”,用于理解脚本的含义。脚本语言有很多种,也有相应的配套解释器。
不同的变成语言写的脚本 执行脚本的 “解释器“ 也不是不一样的 https://www.tiobe.com/tiobe-index/ 可以查看各编程语言。
三种处理逻辑 顺序执行:程序按从上到下顺序执行 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行 循环执行:程序执行过程中需要重复执行多次某段语句(已知次数 已知条件 死循环)
shell脚本
shell作用
Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当 了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执 行的操作传递给内核执行,并输出执行结果。 常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符 等方面会存在一些区别。通过/etc/shells 文件可以了解当前系统所支持的 Shell 脚本种类。
[root@c1 ~]# cat /etc/shells #查看支持的shell 本系统。
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
linux中常见的shell
- bash:基于gun的框架下发展的shell
- csh:类似c语言的shell
- tcsh:整合了csh提供了更多功能
- sh:已经被bash替换
- nologin:让用户无法登录 bash (/bin/bash)是目前大多数Linux 版本采用的默认shell
shell脚本用途
- 自动化常用命令
- 执行系统管理和故障排除
- 创建简单的应用程序
- 处理文本或文件
优势:
- 减少重复性操作
- 交互性任务 免交互
- 批量事务处理
- 服务运行状态监控
- 定时任务执行 不用熬夜(hhha)
shell脚本的基本机构
什么是shell脚本?
- 就是将命令按顺序一一列出,最后自动执行
- 执行需要权限,也可以直接使用路径
- 脚本其实不复杂,可结合各种Shell控制语句以完成更复杂的操作。
脚本基本规范
!!#ffff00 脚本申明(解释器)!!:第一行开头“!!#00ff00 #!/bin/bash!!”,表示此行以下的代码语句是通过/bin/bash程序来解释执行。#!/bin/bash为默认的解释器还有其他类型的解释器,#!/bin/python #!/bin/expect (可选是否写 建议写)
!!#ffff00 注释信息!!:以!!#00ff00 #!!开头的语句表示为注释信息 在执行过程中不会被执行 # 注 释 部分场景下 // 也是注释。(可以自己选择写不写)
!!#ffff00 可执行语句!!:比如!!#00ff00 echo!!命令用于输出!!#00ff00 “ ”!!之间的字符串 (必须写 不写执行锤子👀)
!!#ffff00 脚本名称规范!!:文件名以.sh结尾,方便识别。 (指令会高亮 方便识别)
脚本代码开头约定:
- 第一行一般为调用使用的语言
- 程序名,避免更改文件名后无法找到正确的文件
- 版本号
- 更改后的时间
- 作者相关信息
- 该程序的作用,及注意事项
- 最后是各版本的更新简要说明
第一个脚本!!!!
!/bin/bash
echo my first script
# ------------------------------
# Filename: i.sh
# Version: 4.2.46
# Date: 2020/05/30
# Author: xyy
# Email: 邮箱
# Website: www.xxx.com
# Description: /
# Copyright: 版权
# License: 许可
#-------------------------------
#以上其实都可以不写 了解下就可以
bash --version 可以查看版本号
执行脚本
指定路径去执行文件,文件需要有执行权限。
- 绝对路径。如:/root/i.sh
- 相对路径。如:./i.sh
[root@c1 ~]# /root/i.sh #常规情况下 直接绝对路径执行是权限不够的 。
-bash: /root/i.sh: 权限不够
[root@c1 ~]# chmod +x /root/i.sh
[root@c1 ~]# /root/i.sh #加权限后 执行
my first script
指定解释器去执行(bash 脚本名),不需要执行权限
[root@c1 ~]# bash i.sh #可以直接执行
my first script
- “source 脚本名” 或 “ . 脚本名”。 #不会启动子shell环境 会影响当前环境 不建议使用 注意:
脚本中的空白行会被解释器忽略。
脚本中,除了shebang,余下所有以#开头的行,都回被视作注释行而被忽略。此即为注释行。
脚本错误调试
1.命令错误 命令错误不会影响接下来的命令,之后的命令会继续执行。
[root@c1 ~]# bash ceshi.t
c1
moon
[root@c1 ~]# bash ceshi.t
ceshi.t:行2: hostnam: 未找到命令
moon
2.语法错误 会导致后续的命令不执行。造成脚本中一部分命令已执行,一部分未执行。 会提示或者部分不执行
[root@c1 ~]# bash ceshi.sh
ceshi.sh:行6: 警告:立即文档在第 2 行被文件结束符分隔 (需要 `EOF')
3.逻辑错误 执行脚本 出现的结果不是所需 ,靠自己排查 经验-搜索-AI 等
bash -n 脚本名称 检查语法错误
bash -x 脚本名称 检查逻辑错误 运行一遍脚本
set -e 脚本的前面输入 一旦出错立即停止运行。
重定向与管道符
1.标准输出和输入 |类型 |设备文件 |文件描述编号 |默认设备 | |:--| |标准输入 |/dev/stdin |0 |键盘 | |标准输出 |/dev/stdout |1 |显示器 | |标准错误输出 |/dev/stderr |2 |显示器 | 交互式硬件设备
- 标准输入:从该设备接收用户输入的数据
- 标准输出:通过该设备向用户输出数据
- 标准错误:通过该设备报告执行出错信息
2.重定向 ,不输出到默认输出设备上,输出到你指定的位置(文件 其他输出设备)
输入重定向 | | |:--| |命令 < 文件 |从指定的文件读取文件 | |命令 << 分界符 |从标准输入中读入,直到遇见分界符才停止 | |命令 < 文件1 > 文件2 |将文件1 作为命令的标准输入 输出到文件2 |
输出重定向 |指令 |效果 | |:--| |cmd> 文件 |将标准输出结果保存到指定的文件中(覆盖原有内容) | |cmd >> 文件 |将标准输出结果追加到指定的文件尾部 | |cmd 2> 文件 |将错误输出信息保存到指定文件中(覆盖原有内容) | |cmd 2>> 文件 |将错误输出信息追加到指定文件尾部 | |cmd > 文件 2>&1 |混合输出,将标准输出与错误输出保存到文同一个文件中 | |cmd 2> 文件 1>&2 |混合输出,将标准输出与错误输出保存到文同一个文件中 | |cmd &> 文件 |混合输出,将标准输出与错误输出保存到文同一个文件中同上 | |cmd >& 文件 |混合输出,将标准输出与错误输出保存到文同一个文件中 |
&表示混合,&> 和 >& 都表示将标准输出和错误输出重定向到新文件,一股脑的输入。
详解:
[root@c1 ~]# echo "123" >123.t #标准输入 123 到 123.t文件中
[root@c1 ~]# cat 123.t
123
libai用户设置密码 直接从文件123.t 中获取。
[root@c1 ~]# passwd --stdin libai < 123.t
更改用户 libai 的密码 。
passwd: 鉴定令牌操作错误
[root@c1 ~]# setenforce 0
[root@c1 ~]# passwd --stdin libai < 123.t
更改用户 libai 的密码 。
passwd: 鉴定令牌操作错误
[root@c1 ~]# systemctl stop firewalld.service
[root@c1 ~]# passwd --stdin libai < 123.t
更改用户 libai 的密码 。
passwd:所有的身份验证令牌已经成功更新。
{ } 确定变量的范围
起始和结束 “ ” 弱引用可以识别变量
‘ ’强引用 最蠢 不识别变量
· · 反撇 调用命令执行结果 效果和$ ()相同