目录
7.实战脚本:(实际生产脚本,手把手教学,看这一篇就够了)
在Bash脚本中,数组是可以存储一个或者多个值的变量。数组的元素可以通过索引来访问,索引从0开始。
1.定义数组:
你可以使用括号()
来定义数组,并使用空格来分割每个元素:
bash
my_array=("apple" "banana" "cherry" "date")
你也可以使用索引来为数组添加元素:
bash
my_array[0]="apple"
my_array[1]="banana"
my_array[2]="cherry"
my_array[3]="date"
上面两种方式都创建了同样的数组。
2.访问数组元素:
数组元素可以通过索引来访问。用{}
包围数组名和索引([]
内)即可:
bash
echo ${my_array[0]} # 输出 "apple"
使用@
或*
可以获取数组的全部元素:
bash
echo ${my_array[@]} # 输出 "apple banana cherry date"
3.获取数组长度:
通过#
和数组名可以获取数组的长度:
bash
echo ${#my_array[@]} # 输出 "4"
4.遍历数组元素:
使用for
循环可以遍历数组的全部元素:
bash
for fruit in "${my_array[@]}"
do
echo $fruit
done
这将会按顺序输出数组中的所有元素:"apple", "banana", "cherry", "date"。
5.删除数组元素:
用unset
命令可以删除数组的元素:
bash
unset my_array[1] # 删除元素 "banana"
echo ${my_array[@]} # 输出 "apple cherry date"
注意,删除元素后,数组的索引不会重排,my_array[1]
会被删除,后续元素的索引仍然不变。
6.切片操作:
你可以通过索引和长度来获取数组的一部分:
bash
echo ${my_array[@]:1:2} # 从索引"1"开始,获取2个元素,输出 "cherry date"
以上就是Bash脚本中使用数组的一些基础知识和操作,能覆盖日常编程的大部分需求。
7.实战脚本:
#!/bin/bash
# 定义目录数组
directories_to_backup=("/home/user/documents" "/home/user/pictures" "/home/user/videos")
# 定义备份存储路径
backup_location="/home/user/backups"
# 备份的过期时间(天)
backup_expiry=30
# 定义日志文件路径
backup_log="/home/user/backup_log.txt"
# 获取日期作为备份的一部分
backup_date=$(date +%Y%m%d)
current_time=$(date '+%Y-%m-%d %H:%M:%S')
# 函数:记录日志
log_message() {
echo "$current_time - $1" >> "$backup_log"
}
# 函数:删除旧的备份文件
delete_old_backups() {
find "$backup_location" -mtime +$backup_expiry -delete
}
# 删除超出保留期限的备份
delete_old_backups
# 循环遍历目录数组
for dir in "${directories_to_backup[@]}"
do
# 创建备份文件名
base=$(basename "$dir")
backup_file="${backup_location}/${base}-${backup_date}.tar.gz"
# 执行备份操作,并检查是否成功
if tar -czf "$backup_file" "$dir" > /dev/null 2>&1; then
# 获取备份文件大小
size=$(du -sh "$backup_file" | cut -f1)
log_message "Backup of $dir was successful. File Size: $size. Backup stored in $backup_file"
else
log_message "Backup of $dir failed."
fi
done
# 结束脚本
log_message "Backup process completed."
# 结束脚本输出到控制台
echo "Backup process completed, details logged in $backup_log"
上述脚本是一个自动化的Shell脚本,用于备份指定的目录,并删除过期的备份,同时生成一份包含备份操作细节的日志文件。现在我会详细分析这个脚本的每一部分:
脚本开始:
bash
#!/bin/bash
这是一个shebang行,它告诉系统这个脚本应该使用/bin/bash
解释器来执行。
变量定义:
变量定义部分包含备份目标、存储位置、过期时间和日志文件路径。
bash
directories_to_backup=("/home/user/documents" "/home/user/pictures" "/home/user/videos")
backup_location="/home/user/backups"
backup_expiry=30
backup_log="/home/user/backup_log.txt"
日期和时间获取:
通过date
命令获取当前日期和时间,用于备份文件命名和日志记录。
bash
backup_date=$(date +%Y%m%d)
current_time=$(date '+%Y-%m-%d %H:%M:%S')
函数log_message:
定义了一个用来向日志文件追加文本的函数,记录备份操作的详细信息。
bash
log_message() {
echo "$current_time - $1" >> "$backup_log"
}
函数delete_old_backups:
定义了一个函数,用来删除旧的备份文件,即那些修改时间超出备份保留期限的文件。
bash
delete_old_backups() {
find "$backup_location" -mtime +$backup_expiry -delete
}
执行删除旧备份操作:
在循环遍历目录数组之前,调用delete_old_backups
函数,删除超出保留期限的备份。
bash
delete_old_backups
备份操作循环:
使用for
循环遍历数组中的每个目录,并执行备份操作。
bash
for dir in "${directories_to_backup[@]}"
备份文件名创建:
在循环中为每个目录创建一个基于日期的唯一备份文件名。
bash
base=$(basename "$dir")
backup_file="${backup_location}/${base}-${backup_date}.tar.gz"
执行备份并检查结果:
使用tar
命令压缩备份目录,并将标准和错误输出重定向到/dev/null
(抑制输出)。通过判断tar
命令的退出状态,记录备份成功或失败的消息到日志中。
bash
if tar -czf "$backup_file" "$dir" > /dev/null 2>&1; then
size=$(du -sh "$backup_file" | cut -f1)
log_message "Backup of $dir was successful. File Size: $size. Backup stored in $backup_file"
else
log_message "Backup of $dir failed."
fi
结束脚本:
在所有的备份操作都尝试后,记录一条完成的消息到日志文件,并在控制台输出相关信息。
bash
log_message "Backup process completed."
echo "Backup process completed, details logged in $backup_log"
总结:
这个脚本将选择的目录进行压缩备份到指定的路径,为每个备份创建以日期命名的文件,并保证只保存最近30天内的备份。除了自动备份和清理,脚本还负责记录每个操作的详细日志,有助于审计和错误追踪。