Linux 脚本编程:zsh 与备份脚本实用指南
1. zsh 简介
zsh 是一款在编程环境中常用的 shell,它为脚本编程者提供了众多实用功能。zsh 采用可加载模块的方式,加载独立的代码库,使得使用高级函数就像运行命令行命令一样简单。这些可加载模块涵盖了从复杂数学算法到网络应用(如 FTP 和 HTTP)等多种功能。
2. zsh 加载模块
zsh 有许多模块可为其提供额外的内置命令,且随着程序员不断开发新模块,这个列表还在持续增长。以下是一些常用模块:
| 模块 | 描述 |
| — | — |
| zsh/datetime | 额外的日期和时间命令及变量 |
| zsh/files | 基本文件处理命令 |
| zsh/mapfile | 通过关联数组访问外部文件 |
| zsh/mathfunc | 额外的科学函数 |
| zsh/pcre | 扩展正则表达式库 |
| zsh/net/socket | Unix 域套接字支持 |
| zsh/stat | 访问 stat 系统调用以提供系统统计信息 |
| zsh/system | 各种底层系统功能的接口 |
| zsh/net/tcp | 访问 TCP 套接字 |
| zsh/zftp | 专门的 FTP 客户端命令 |
| zsh/zselect | 当文件描述符准备好时阻塞并返回 |
| zsh/zutil | 各种 shell 实用工具 |
2.1 查看、添加和删除模块
使用
zmodload
命令可以查看、添加和删除 zsh 会话中的模块。
-
查看已安装模块
:不使用任何命令行参数运行
zmodload
命令,可显示当前安装的模块。
% zmodload
zsh/complete
zsh/files
zsh/main
zsh/parameter
zsh/stat
zsh/terminfo
zsh/zle
zsh/zutil
%
-
添加新模块
:在
zmodload命令行中指定模块名称即可添加新模块。
% zmodload zsh/net/tcp
%
添加模块时没有提示信息,可再次运行
zmodload
命令,新模块应会出现在已安装模块列表中。加载模块后,与该模块关联的命令将作为内置命令可用。
-
小提示
:通常将
zmodload
命令放在
$HOME/.zshrc
启动文件中,这样在 zsh 启动时,喜欢的功能会自动加载。
3. zsh 脚本编程
zsh 主要为脚本编程者提供高级编程环境,它具备许多使脚本编写更轻松的特性。
3.1 数学运算
zsh 支持轻松执行数学函数,并且在所有数学运算中完全支持浮点数。
-
计算方法
:zsh 支持两种执行数学运算的方法。
-
let
命令
:使用
let
命令时,应将操作括在双引号中以允许使用空格。
% let value1=" 4 * 5.1 / 3.2 "
% echo $value1
6.3749999999999991
%
使用浮点数会引入精度问题,可使用
printf
命令指定所需的小数精度来正确显示答案。
% printf "%6.3f\n" $value1
6.375
%
- **双括号**:双括号方法有两种定义数学运算的技巧。
% value1=$(( 4 * 5.1 ))
% (( value2 = 4 * 5.1 ))
% printf "%6.3f\n" $value1 $value2
20.400
20.400
%
双括号可以只围绕操作(前面加美元符号),也可以围绕整个赋值语句,两种方法结果相同。
如果事先不使用
typeset
命令声明变量的数据类型,zsh 会尝试自动分配数据类型。在处理整数和浮点数时,这可能会导致问题。例如:
% value=10
% value2=$(( $value1 / 3 ))
% echo $value2
3
%
若要确保结果为浮点数,必须指定带小数点的数字。
% value=10.
% value2=$(( $value1 / 3. ))
% echo $value2
3.3333333333333335
%
-
数学函数
:默认的 zsh 不包含任何特殊数学函数,但安装
zsh/mathfunc模块后,将拥有大量数学函数。
% value1=$(( sqrt(9) ))
zsh: unknown function: sqrt
% zmodload zsh/mathfunc
% value1=$(( sqrt(9) ))
% echo $value1
3.
%
3.2 结构化命令
zsh 为脚本提供了常见的结构化命令,如
if-then-else
语句、
for
循环(包括 C 风格)、
while
循环、
until
循环、
select
语句和
case
语句,其语法与 Bash shell 相同。此外,zsh 还包含一个不同的结构化命令
repeat
,其格式如下:
repeat param
do
commands
done
param
参数必须是一个数字或一个计算结果为数字的数学运算。
repeat
命令会将指定的命令执行相应的次数。
% cat test4
#!/bin/zsh
# using the repeat command
value1=$(( 10 / 2 ))
repeat $value1
do
echo "This is a test"
done
$ ./test4
This is a test
This is a test
This is a test
This is a test
This is a test
%
3.3 函数
zsh 支持使用
function
命令或定义函数名后加括号的方式创建自定义函数。
% function functest1 {
> echo "This is the test1 function"
}
% functest2() {
> echo "This is the test2 function"
}
% functest1
This is the test1 function
% functest2
This is the test2 function
%
与 Bash shell 函数类似,可在脚本中定义函数,并使用全局变量或向函数传递参数。
4. zsh 实用示例:TCP 模块
zsh 的
tcp
模块非常实用,它允许创建 TCP 套接字、监听传入连接并与远程系统建立连接,这是在 shell 应用程序之间传输数据的好方法。
4.1 服务器端操作
server$ zsh
server% zmodload zsh/net/tcp
server% ztcp -l 8000
server% listen=$REPLY
server% ztcp -a $listen
ztcp -l
选项用于监听指定的 TCP 端口(此例中为 8000)的传入网络连接,特殊变量
$REPLY
包含与网络套接字关联的文件句柄。
ztcp -a
选项用于等待建立传入连接。
4.2 客户端操作
client$ zsh
client% zmodload zsh/net/tcp
client% ztcp localhost 8000
client% remote=$REPLY
client%
4.3 数据传输
连接建立后,可使用
print
语句发送消息,使用
read
语句接收消息。
client% print 'This is a test message' >&$remote
client%
server% read -r data <&$remote; print -r $data
This is a test message
server%
4.4 关闭连接
完成数据传输后,使用
-c
选项关闭相应的句柄。
server% ztcp -c $listen
server% ztcp -c $remote
client% ztcp -c $remote
5. 编写简单脚本实用工具:自动化备份
在 Linux 环境中,数据备份至关重要。可使用 shell 脚本来自动化备份特定目录,并记录数据的历史版本。
5.1 备份所需功能
-
tar命令 :在 Linux 中,tar命令用于将整个目录归档为单个文件。
$ ls -1 /home/christine/Project
addem.sh
AndBoolean.sh
askage.sh
[…]
update_file.sh
variable_content_eval.sh
$
$ tar -cf archive.tar /home/christine/Project/*.*
tar: Removing leading `/' from member names
tar: Removing leading `/' from hard link targets
$
$ ls -og archive.tar
-rw-rw-r-- 1 112640 Aug 6 13:33 archive.tar
$
为避免脚本中出现输出消息,可将 STDERR 重定向到
/dev/null
文件。
$ pwd
/home/christine
$
$ tar -cf archive.tar Project/*.* 2>/dev/null
$
$ ls -og archive.tar
-rw-rw-r-- 1 112640 Aug 6 13:38 archive.tar
$
-
压缩文件
:由于
tar归档文件可能占用大量磁盘空间,可使用-z选项将其压缩为 gzipped tar 文件(即 tarball)。
$ tar -zcf archive.tgz Project/*.* 2>/dev/null
$
$ ls -hog archive.tgz
-rw-rw-r-- 1 11K Aug 6 13:40 archive.tgz
$
$ ls -hog archive.tar
-rw-rw-r-- 1 110K Aug 6 13:38 archive.tar
$
5.2 配置文件
为避免为每个要备份的文件目录修改或创建新的归档脚本,可使用配置文件。配置文件应包含要包含在归档中的每个目录的绝对路径。
$ cat Files_To_Backup.txt
/home/christine/BackupScriptProject/
/home/christine/Downloads/
/home/christine/Does_not_exist/
/home/christine/PythonConversion/
$
5.3 脚本实现
脚本使用
read
命令读取配置文件,并将每个目录的名称添加到归档列表中。同时,会检查目录是否存在,若不存在则发出警告信息。
exec 0 < $config_file
read file_name
file_no=1
file_list=""
while [ $? -eq 0 ]
do
if [ -f $file_name -o -d $file_name ]
then
file_list="$file_list $file_name"
else
echo
echo "$file_name, does not exist."
echo "Obviously, I will not include it in this archive."
echo "It is listed on line $file_no of the config file."
echo "Continuing to build archive list..."
echo
fi
file_no=$[$file_no + 1]
read file_name
done
通过以上内容,我们了解了 zsh 的各种功能以及如何编写自动化备份脚本,这些知识可以帮助我们更高效地进行 Linux 脚本编程和系统管理。
6. 脚本账户删除
在 Linux 系统中,有时候需要删除账户。可以编写一个简单的脚本来实现这个功能。
6.1 实现思路
要实现账户删除脚本,需要以下几个步骤:
1. 检查脚本是否以 root 权限运行,因为删除账户需要 root 权限。
2. 获取要删除的账户名。
3. 确认是否真的要删除该账户。
4. 删除账户及其相关文件。
6.2 脚本示例
#!/bin/bash
# 检查是否以 root 权限运行
if [ "$(id -u)" -ne 0 ]; then
echo "请以 root 权限运行此脚本。"
exit 1
fi
# 获取要删除的账户名
read -p "请输入要删除的账户名: " username
# 确认是否删除
read -p "你确定要删除 $username 账户吗?(y/n): " confirm
if [ "$confirm" != "y" ]; then
echo "取消删除操作。"
exit 0
fi
# 删除账户及其相关文件
userdel -r $username
if [ $? -eq 0 ]; then
echo "账户 $username 已成功删除。"
else
echo "删除账户 $username 时出错。"
fi
7. 系统审计
系统审计可以帮助我们了解系统的运行状态,发现潜在的安全问题。以下是一个简单的系统审计脚本示例。
7.1 审计内容
这个脚本将审计以下内容:
- 系统中的用户账户。
- 最近登录的用户。
- 系统中的开放端口。
7.2 脚本示例
#!/bin/bash
# 审计系统中的用户账户
echo "系统中的用户账户:"
cat /etc/passwd | cut -d: -f1
# 审计最近登录的用户
echo "最近登录的用户:"
last
# 审计系统中的开放端口
echo "系统中的开放端口:"
netstat -tuln
8. 总结
本文详细介绍了 zsh 脚本编程和一些实用的脚本工具。首先,我们了解了 zsh 的可加载模块,通过
zmodload
命令可以方便地查看、添加和删除模块,并且可以将常用模块的加载命令放在启动文件中实现自动加载。在 zsh 脚本编程方面,它支持丰富的数学运算和函数,包括浮点数运算和众多数学函数,同时提供了常见的结构化命令和自定义函数的创建方式。通过 TCP 模块的示例,展示了如何在 shell 应用程序之间进行数据传输。
在脚本实用工具方面,我们学习了如何编写自动化备份脚本,包括使用
tar
命令进行归档和压缩,以及如何处理配置文件和检查目录的存在性。还介绍了脚本账户删除和系统审计的脚本实现,这些脚本可以帮助我们更高效地管理 Linux 系统。
通过掌握这些知识和技能,我们可以更好地利用 shell 脚本进行自动化任务,提高工作效率,同时增强系统的安全性和稳定性。希望这些内容对大家在 Linux 脚本编程和系统管理方面有所帮助。
下面是一个简单的流程图,展示了自动化备份脚本的主要流程:
graph TD;
A[开始] --> B[读取配置文件];
B --> C{目录是否存在};
C -- 是 --> D[添加到归档列表];
C -- 否 --> E[发出警告信息];
D --> F[继续读取配置文件];
E --> F;
F -- 有新记录 --> B;
F -- 无新记录 --> G[创建归档文件];
G --> H[压缩归档文件];
H --> I[结束];
同时,为了更清晰地展示 zsh 脚本编程的主要内容,我们可以用表格进行总结:
| 类别 | 内容 |
| — | — |
| 模块管理 | 使用
zmodload
命令查看、添加和删除模块 |
| 数学运算 | 支持
let
命令和双括号两种运算方法,处理浮点数需注意数据类型 |
| 结构化命令 | 包含常见命令及
repeat
命令 |
| 函数 | 支持
function
命令和函数名加括号两种创建方式 |
| 实用示例 | TCP 模块用于数据传输 |
通过这些总结和图表,我们可以更直观地回顾和理解本文的重点内容。
超级会员免费看
22

被折叠的 条评论
为什么被折叠?



