56、Linux 脚本编程:zsh 与备份脚本实用指南

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 模块用于数据传输 |

通过这些总结和图表,我们可以更直观地回顾和理解本文的重点内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值