主要内容:
Shell概述,编写及执行脚本、Shell变量(自定义变量、环境变量、预定义变量、位置变量)、数值运算(expr工具、$[]、let、bc)
一、Shell概述
Shell 是操作系统提供的一种命令行解释器,它允许用户通过输入命令来与操作系统进行交互。Shell 提供了一个界面,用户可以通过这个界面执行各种系统命令、运行程序、管理文件和目录等。在Linux内核与用户之间的解释器程序,通常指:/bin/bash
负责向内核翻译及传达用户/程序指令,相当于操作系统的“外壳”
1)基本功能
- 命令解释:Shell 负责解释用户输入的命令,并将其转换为操作系统可以执行的操作。
- 脚本编写:Shell 支持编写脚本,用户可以将一系列命令组合成一个脚本文件,以便自动执行复杂的任务。
- 环境管理:Shell 管理用户的环境变量,如 PATH、HOME 等,这些变量影响命令的查找和执行。
- 管道和重定向:Shell 支持使用管道(|)将一个命令的输出作为另一个命令的输入,以及使用重定向(>、<、>>)将命令的输入输出重定向到文件。
2)常见的 Shell
- Bash (Bourne Again SHell):Linux 和 macOS 默认的 Shell,是 Bourne Shell (sh) 的增强版本,支持命令补全、历史记录、脚本编程等功能。
- Zsh (Z Shell):一个兼容 Bash 的 Shell,提供了更多的功能和自定义选项,如更好的命令补全、主题支持等。
- Fish (Friendly Interactive Shell):一个用户友好的 Shell,提供了自动建议、语法高亮、Web 配置界面等功能。
- PowerShell:微软开发的 Shell,主要用于 Windows 系统,支持命令行管理、自动化任务和脚本编写。
3)Shell的使用方式
- 交互式(命令行):人工干预、智能化程度高;逐条解释执行、效率低;
- 非交互式(脚本):需要提前设计、智能化难度大;批量执行、效率高、方便在后台运行;
4)常见的Shell程序种类
- 通过usermod、chsh更改登录Shell;
- 手动执行目标Shell程序;
[root@svr7 ~]# cat /etc/shells //查看系统拥有的解释器
/bin/sh //多数Unix默认的Shell
/bin/bash //多数Linux默认使用的Shell
/sbin/nologin //非登录Shell
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
若需要临时使用另一种Shell环境,可以直接执行对应的Shell解释器程序
例如1:切换sh解释器
[root@svr7 ~]# sh //切换sh解释器
sh-4.2# //sh运行风格
sh-4.2# exit //返回到切换前的bash环境
解释:用户 —> /bin/bash默认解释器—> sh解释器(用户登录后,默认使用bash解释器,切换sh解释器(子Shell),则默认bash解释器暂时放入后台等待子Shell解释器退出)
例如2:要执行ksh可以切换到ksh命令行环境
[root@svr7 ~]# yum -y install ksh //安装ksh解释器
[root@svr7 ~]# cat /etc/shells
/bin/ksh //确认当前系统已识别ksh
/bin/rksh
...
[root@svr7 ~]# ksh //切换ksh解释器
# //ksh运行风格
# ls
anaconda-ks.cfg 公共 视频 文档 音乐
initial-setup-ks.cfg 模板 图片 下载 桌面
# exit //返回到切换前的bash环境
补充:ksh无法进行Tab补齐,不支持快捷键
5)环境配置
用户可以通过修改 Shell 的配置文件来自定义 Shell 的行为,常见的配置文件包括:
- .bashrc:Bash 的交互式非登录 Shell 配置文件。
- .bash_profile:Bash 的登录 Shell 配置文件。
- .zshrc:Zsh 的配置文件。
- config.fish:Fish 的配置文件。
通过这些配置文件,用户可以设置别名、环境变量、自定义提示符等。
二、Shell脚本介绍
提前写好可执行语句,能够完成特定任务的文件(顺序、批量化处理,解释型程序)
1、创建脚本思路
1)明确脚本目标
在开始编写脚本之前,首先要明确脚本的目标和功能。例如,你可能想要创建一个脚本来备份文件、监控系统状态、自动化日常任务等。
2)规划脚本结构
根据脚本的目标,规划脚本的结构和流程。考虑需要执行的步骤、可能的输入和输出、以及如何处理错误和异常情况。
3)选择合适的 Shell
根据你的需求和操作系统的不同,选择一个合适的 Shell。常见的选择包括 Bash、Zsh 和 Fish。大多数情况下,Bash 是一个通用且功能强大的选择。
4)编写脚本
① 脚本头部
每个 Shell 脚本都应该以一个“shebang”行开始*(Sha-Bang调用标记),指定要使用的 Shell 解释器。例如,使用 Bash 时,脚本的第一行应该是:
#!/bin/bash
② 添加注释
在脚本中添加注释,解释每个部分的功能。注释以 #
开头,例如:
# 这是一个备份脚本的示例
③ 定义变量
根据需要定义变量,存储文件路径、配置选项等。例如:
source_dir="/path/to/source"
backup_dir="/path/to/backup"
④ 编写主要逻辑
根据规划的结构,编写脚本的主要逻辑。使用条件判断、循环、函数等结构来实现所需的功能。例如,一个简单的备份脚本可能包含以下逻辑:
# 检查源目录是否存在
if [ ! -d "$source_dir" ]; then
echo "源目录不存在: $source_dir"
exit 1
fi
# 创建备份目录(如果不存在)
mkdir -p "$backup_dir"
# 执行备份
cp -r "$source_dir"/* "$backup_dir"
# 输出备份完成信息
echo "备份完成: $source_dir -> $backup_dir"
⑤ 处理错误和异常
在脚本中添加错误处理逻辑,确保在出现错误时能够及时通知用户并采取适当的措施。例如:
if [ $? -ne 0 ]; then
echo "备份失败"
exit 1
fi
5)添加执行权限,并测试脚本
编写完成后,测试脚本以确保其按预期工作。尝试不同的输入和场景,检查输出和错误处理是否正确。
[root@svr7 ~]# vim /root/first.sh //创建脚本文件
echo 'Hello World!' //写脚本语句
[root@svr7 ~]# chmod +x /root/first.sh //加执行权限
[root@svr7 ~]# /root/first.sh //运行脚本
Hello World!
6)优化和改进
根据测试结果,优化和改进脚本。考虑添加更多的功能、改进错误处理、提高脚本的效率和可读性。
7)文档和分享
为脚本编写文档,解释其功能、使用方法和注意事项。如果合适,可以将脚本分享给其他人使用。
2、规范的脚本构成
一个规范的 Shell 脚本不仅需要实现预期的功能,还应该具备良好的结构、注释和错误处理机制。
- Shebang 行:脚本的第一行应该是 Shebang 行,指定脚本解释器。
- 脚本描述:在 Shebang 行之后,添加一段简短的描述,说明脚本的用途和功能。
- 版权和版本信息:添加版权和版本信息,以便其他人了解脚本的来源和更新情况。
- 环境变量和全局变量:使用大写字母命名环境变量,小写字母命名全局变量,以示区分。
- 函数定义:将复杂的逻辑封装在函数中,提高代码的可读性和可维护性。
- 主要逻辑:调用之前定义的函数,并处理可能的输入和输出。
- 错误处理:在脚本中添加错误处理机制,确保在出现错误时能够及时通知用户并采取适当的措施。
- 清理和收尾:在脚本结束前,进行必要的清理工作,如删除临时文件、恢复环境变量等。
- 文档和注释:在脚本中添加详细的注释,解释每个部分的功能。
示例脚本:
#!/bin/bash
# 这是一个用于备份指定目录的脚本
# 作者: [你的名字]
# 版本: 1.0
# 最后更新日期: [日期]
# 环境变量
export TEMP_DIR="/tmp"
# 全局变量
source_dir="/path/to/source"
backup_dir="/path/to/backup"
# 检查目录是否存在的函数
# 参数: 目录路径
check_directory() {
if [ ! -d "\$1" ]; then
echo "目录不存在: \$1"
exit 1
fi
}
# 执行备份的函数
perform_backup() {
cp -r "$source_dir"/* "$backup_dir"
if [ $? -ne 0 ]; then
echo "备份失败"
exit 1
fi
}
# 主要逻辑
check_directory "$source_dir"
check_directory "$backup_dir"
perform_backup
echo "备份完成: $source_dir -> $backup_dir"
# 清理临时文件
rm -rf "$TEMP_DIR/backup_tmp"
补充:脚本 &> /dev/null 程序后台运行并把输出丢入”黑洞”
3、脚本的执行方式
脚本的执行方式取决于操作系统和脚本文件的权限设置。
1)直接执行(标准规范方式)
- 添加x权限,指定脚本文件的路径(绝对路径 / 相对路径)(脚本声明)
解释:用户 —> /bin/bash默认解释器 —> bash解释器(读取脚本声明)—> 执行脚本文件
[root@svr7 opt]# vim test01.sh
#!/bin/bash //声明解释器
#A test program for Shell-Script //声明注释
echo 'Hello World' //执行脚本
[root@svr7 opt]# chmod +x /opt/test01.sh //脚本添加执行权限
[root@svr7 opt]# /opt/test01.sh //绝对路径方式运行
Hello World
常见报错:坏的解释器: 没有那个文件或目录
[root@svr7 opt]# vim /opt/test01.sh
#!/bin/baash //脚本声明的错误解释器
...
[root@svr7 opt]# /opt/test01.sh
-bash: /opt/test01.sh: /bin/baash: 坏的解释器: 没有那个文件或目录
2)通过解释器执行
- 格式:sh 脚本文件路径 //使用解释器执行脚本。无需x权限(