BASH-数组用法及实战生产脚本(小白提升,手把手教你写生产脚本)

目录

1.定义数组:

2.访问数组元素:

3.获取数组长度:

4.遍历数组元素:

5.删除数组元素:

6.切片操作:

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天内的备份。除了自动备份和清理,脚本还负责记录每个操作的详细日志,有助于审计和错误追踪。

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值