一、shell概述
Linux 系统中的 Shell 是一个特殊的应用程序,它介于操作系统内核与用户之间,充当了一个“命令解释器”的角色,负责接收用户输入的操作指令(命令)并进行解释,将需要执行的操作传递给内核执行,并输出执行结果。
常见的 Shell 解释器程序有很多种,使用不同的 Shell 时,其内部指令、命令行提示符等方面会存在一些区别。通过/etc/shell 文件可以了解当前系统所支持的 Shell 脚本种类。
1.用户登录的shell类型
shell的作用: 常见的shell解释器类型有多种,在使用不同shell类型时是会存在不同的区别比如内部指令、命令行提示符 等方面会存在一些区别,通过/etc/shells 文件可以了解当前本系统所支持的 Shell 脚本种类。
查看本机支持的shell类型
linux 中常见的shell
- bash:基于GUN的框架下发展的shell
- csh:类似C语言的shell
- tcsh:整合了csh 提供了更多功能
- sh:已经被bash替换
- nologin:让用户无法登录
bash特性:
- 支持快捷键:比如 ctrl+c 强制终止进程 、 ctrl+l 清屏 、Tab补齐 等等。
- 支持查看历史命令(history)
- 支持别名(alias)
- 标准输入和标准输出的重定向
- 管道符
- 文件名通配机制
- 支持命令hash
- 支持变量
这些功能都是bash特有的,其他shell环境没有这些功能,或者说没有这么全,所以bash取代sh成为了Linux的默认shell。
二、shell脚本
1.什么是shell脚本
- 将要执行的命令按顺序保存到一个文本文件,最后自动执行。
- 执行脚本需要执行权限,也可以使用绝对路径来执行。
- 可结合各种Shell控制语句以完成更复杂的操作。
- 用通俗的话来说就是可以方便工作的工具。
2.shell 脚本构成
脚本名称规范:文件名以.sh结尾,显示高亮方便识别。
脚本代码开头规格:
- 第一行一般为调用使用的语言
- 程序名,避免更改文件名后无法找到正确的文件
- 版本号
- 更改后的时间
- 作者相关信息
- 该程序的作用,及注意事项
- 最后是各版本的更新简要说明
脚本的构成:
- 脚本申明(申明解释器) :第一行开头 “#!/bin/bash”,表示此行以下的代码语句是通过/bin/bash程序来执行。还有其他类型的解释器,比如 #/usr/bin/python、#!/usr/bin/expect 。
- 注释信息: 以“#”开头的语句表示为注释信息,被注释的语句在脚本运行时不会被执行,该段可写可不写。
- 可执行语句: 如echo命令,用于输出“ ”之间的字符串。
3.执行脚本的方式
脚本执行逻辑:
- 顺序执行:程序按从上到下顺序执行依次执行,这种方式一处出错别的都无法继续执行。
- 选择执行:程序执行过程中,根据条件的不同,进行选择不同分支继续执行,如果有出错也可以继续执行剩余部分。
- 循环执行:程序执行过程中需要重复执行多次某段语句,退出循环需要次数或条件。
1.直接使用shell程序来执行读取脚本中的命令,并且不需要执行权限。
2.使用路径执行,可以绝对也可以相对,但需要权限。
3.使用 “source 脚本名” 或 “ . 脚本名”执行脚本,不需要权限,这种不推荐使用。
注意: 使用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 zhubao]# vim zhu.sh
#!/bin/bash
#
if
set -e
cd /op
touch zhu
a=20
~
[root@localhost zhubao]# bash -n zhu.sh //检验语法错误
zhu.sh:行8: 语法错误: 未预期的文件结尾
[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>> | 标准错误输出结果追加到指定的文件尾部 | |
混合输出 | &>无论对错都可以重定向 | 将标准输出、标准错误的内容保存到同一个文件中 |
- &代表混合,代表标准输入和错误输入的混合&>、 >&都表示输入到同一文件下。
- 2>&1 代表把错误输出重定向给标准输出里,相当于又是同一文件下。
3.管道符
将第一个命令的标准输出作为第二个命令的标准输入(例如:cat /etc/passwd | grep root)起到的作用就是连接命令达到效果,并且管道符可以连续使用多个。