掘金 后端 ( ) • 2024-05-13 16:01

theme: awesome-green

一、shell概述

Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。

常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shell 文件可以了解当前系统所支持的 Shell 脚本种类。

1.用户登录的shell类型

shell的作用: 常见的shell解释器类型有多种,在使用不同shell类型时是会存在不同的区别比如内部指令、命令行提示符 等方面会存在一些区别,通过/etc/shells 文件可以了解当前本系统所支持的 Shell 脚本种类。

查看本机支持的shell类型 image.png

linux 中常见的shell

  • bash:基于GUN的框架下发展的shell
  • csh:类似C语言的shell
  • tcsh:整合了csh 提供了更多功能
  • sh:已经被bash替换
  • nologin:让用户无法登录

bash特性:

  1. 支持快捷键:比如 ctrl+c 强制终止进程 、 ctrl+l 清屏 、Tab补齐 等等。
  2. 支持查看历史命令(history)
  3. 支持别名(alias)
  4. 标准输入和标准输出的重定向
  5. 管道符
  6. 文件名通配机制
  7. 支持命令hash
  8. 支持变量

这些功能都是bash特有的,其他shell环境没有这些功能,或者说没有这么全,所以bash取代sh成为了Linux的默认shell。

二、shell脚本

1.什么是shell脚本

  • 将要执行的命令按顺序保存到一个文本文件,最后自动执行。
  • 执行脚本需要执行权限,也可以使用绝对路径来执行。
  • 可结合各种Shell控制语句以完成更复杂的操作。
  • 用通俗的话来说就是可以方便工作的工具。

2.shell 脚本构成

脚本名称规范:文件名以.sh结尾,显示高亮方便识别。

脚本代码开头规格:

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

脚本的构成:

  1. 脚本申明(申明解释器) :第一行开头 “#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来执行。还有其他类型的解释器,比如 #/usr/bin/python#!/usr/bin/expect
  2. 注释信息: 以“#”开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行,该段可写可不写。
  3. 可执行语句: 如echo命令,用于输出“ ”之间的字符串。 image.png

3.执行脚本的方式

脚本执行逻辑:

  • 顺序执行:程序按从上到下顺序执行依次执行,这种方式一处出错别的都无法继续执行。
  • 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行,如果有出错也可以继续执行剩余部分。
  • 循环执行:程序执行过程中需要重复执行多次某段语句,退出循环需要次数或条件。

1.直接使用shell程序来执行读取脚本中的命令,并且不需要执行权限。 image.png

2.使用路径执行,可以绝对也可以相对,但需要权限。 image.png

3.使用 “source 脚本名” 或 “ . 脚本名”执行脚本,不需要权限,这种不推荐使用。 image.png

注意: 使用shell程序和路径运行执行方式不会影响当前环境中bash设置,会开启一个全新的bash环境执行脚本,而source不推荐使用,source不会启动子shell环境,会影响当前系统环境中的配置。

4.常见脚本调错

脚本错误类型:

  • 命令错误: 命令错误不会影响接下来的命令继续执行。
set -e           //在脚本出错时立刻停止 避免错误命令导致的危险

#!/bin/bash
#this is scritp

set -e
cd /bi
rm -rf ./*

[root@localhost zhu]# bash data.sh 
data.sh: 第 5 行:cd: /bi: 没有那个文件或目录
  • 语法错误: 会导致后续的命令不执行。造成脚本中一部分命令已执行,一部分未执行。
[root@localhost zhu]# bash -x /zhu/data.sh       //检测可输入bash -x来执行一遍脚本用来检查检查报错。
+ set -e
+ cd /bi
/zhu/data.sh: 第 5 行:cd: /bi: 没有那个文件或目录  //报错信息可以直接使用vim +5到出错点来纠错。

[root@localhost zhu]# bash -n /zhu/data.sh       //用来检测语法错误,语法错误无法执行。
  • 逻辑错误: 执行后的效果不是自己想要的,这只能自己去排查,因为只是属于自己技术问题了。

利用脚本搭建一个本地yum仓库,并且下载一个tree程序

[root@localhost zhu]# vim yum.sh         

#!/bin/bash
#

mount /dev/sr0 /mnt

cd /etc/yum.repos.d
mkdir zhu
mv ./*.repo zhu
echo "
[zhu]
name=zhu
baseurl=file:///mnt
gpgcheck=0
 " >> zhu.repo


yum clean all   &>> /dev/null
yum makecache   &>> /dev/null

yum install tree -y  &>> /dev/null

三、重定向与管道服

1.重定向与标准输入和标准输出

交互式硬件设备:

  • 标准输入:从该设备接收用户输入的数据,通过各种辅助操作工具来接收用户输入的数据。
  • 标准输出:通过该设备向用户输出数据,正确执行指令后电脑所反馈的信息。
  • 标准错误:通过该设备报告执行出错信息,报错。

当执行shell命令时,会默认打开3个文件,每个文件有对应的文件描述符来方便我们使用:

类型 设备文件 文件描述编号 设备 标准输入 /dev/stdin 0 键盘、鼠标 标准输出 /dev/stdout 1 显示器 标准错误输出 /dev/stderr 2 显示器

2.重定向

重定向的意思就是,不通过标准输出到默认屏幕上,而是输出到你指定的位置。

类型 操作符 用途 重定向输入 < 例如 命令<文件 ,就是从指定的文件读取数据,而不是从键盘输入 重定向输出 1> 例如 ls+文件>指定文件, 将输出结果保存到指定的文件,在指定文件下有内容的情况下覆盖原有内容。 >> 将输出结果追加到指定的文件尾部 标准错误输出 2> 将错误信息保存到指定的文件(覆盖原有内容) 2>> 标准错误输出结果追加到指定的文件尾部 混合输出 &>无论对错都可以重定向 将标准输出、标准错误的内容保存到同一个文件中
  1. &代表混合,代表标准输入和错误输入的混合&>、 >&都表示输入到同一文件下。
  2. 2>&1 代表把错误输出重定向给标准输出里,相当于又是同一文件下。

3.管道符

将第一个命令的标准输出作为第二个命令的标准输入(例如:cat /etc/passwd | grep root)起到的作用就是连接命令达到效果,并且管道符可以连续使用多个。 image.png