目录
频道首页
👣👣 shell脚本 入门基础
收藏
0
xy20118 最近修改于 2024-05-12 20:05:25

image

什么是脚本?

“脚本”这个词来自话剧舞台。脚本执行就好像戏剧里的演员在“演绎”已经写好的剧本,按照剧情验出来呈现给观众。 脚本程序在执行时,则是由系统的一个解释器,将其一条条的翻译成机器可识别的指令,并按程序顺序执行,并将执行结果呈现给人类。

人类的高级语言也是多种的 汉语 韩语 日语 英语等,去不同的国家 需要说不同的语言进行沟通一样,那不同场景需要选择不同的脚本语言来编写,脚本也需要有一个解释器来执行,脚本的运行环境叫作“解释器”,用于理解脚本的含义。脚本语言有很多种,也有相应的配套解释器。

不同的变成语言写的脚本 执行脚本的 “解释器“ 也不是不一样的 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结尾,方便识别。 (指令会高亮 方便识别)

脚本代码开头约定:

  1. 第一行一般为调用使用的语言
  2. 程序名,避免更改文件名后无法找到正确的文件
  3. 版本号
  4. 更改后的时间
  5. 作者相关信息
  6. 该程序的作用,及注意事项
  7. 最后是各版本的更新简要说明

第一个脚本!!!!

!/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环境 会影响当前环境 不建议使用 注意:
  1. 脚本中的空白行会被解释器忽略。

  2. 脚本中,除了shebang,余下所有以#开头的行,都回被视作注释行而被忽略。此即为注释行。

脚本错误调试

1.命令错误 命令错误不会影响接下来的命令,之后的命令会继续执行。 image

[root@c1 ~]# bash ceshi.t 
c1
moon

image

[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:所有的身份验证令牌已经成功更新。

{ } 确定变量的范围 起始和结束 “ ” 弱引用可以识别变量
‘ ’强引用 最蠢 不识别变量
· · 反撇 调用命令执行结果 效果和$ ()相同

内容大纲
批注笔记
👣👣 shell脚本 入门基础
ArticleBot
z
z
z
z
主页
会议室
Git管理
文章
云文档
看板