AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 771575
Accepted
DEKKER
DEKKER
Asked: 2024-03-04 18:12:44 +0800 CST2024-03-04 18:12:44 +0800 CST 2024-03-04 18:12:44 +0800 CST

如何生成查找表或数据结构并在 Bash 中对其执行循环

  • 772

我正在开发嵌入式Linux。我想写一个自动修复分区的bash脚本。

我声明了一个关联数组,其中键是安装点,值是要安装的设备。

现在,我的问题是设备可能有不同的文件系统,fsck应该选择正确的版本。

每个文件系统都有自己的fsck变体,例如fsck.vfat和fsck.ext4。

我需要以某种方式将其带入循环中,以便调用正确的变体。遗憾的是,主要变体fsck没有在我的配置中提供文件系统的自动修复或检测。

所以真正的问题是如何在这里有一个查找表?

declare -A arrPartitionsToCheck=(
[/run/media/my-backup]="/dev/sda1" # vfat
[/run/media/my-data]="/dev/sdb1"   # ext4
)

for part in "${!arrPartitionsToCheck[@]}"; do

    # Unmount
    # umount /dev/sda1
    umount "${arrPartitionsToCheck[$part]}"

    # Select the right variant of FSCK and repair automatically
    fsck.vfat -a "${arrPartitionsToCheck[$part]}"

    # Mont Again! For example
    # mount /dev/sda1 /run/media/my-backups
    mount "${arrPartitionsToCheck[$part]}" "$part"    

done
bash
  • 2 2 个回答
  • 241 Views

2 个回答

  • Voted
  1. terdon
    2024-03-04T20:47:02+08:002024-03-04T20:47:02+08:00

    您可以从 获取文件系统类型lsblk。例如,在我的机器上:

    $ lsblk -o PATH,FSTYPE
    PATH             FSTYPE
    /dev/mapper/home ext4
    /dev/nvme0n1     
    /dev/nvme0n1p1   vfat
    /dev/nvme0n1p2   
    /dev/nvme0n1p3   BitLocker
    /dev/nvme0n1p4   ntfs
    /dev/nvme0n1p5   ext4
    /dev/nvme0n1p6   crypto_LUKS
    /dev/nvme0n1p7   swap
    

    因此,考虑到这一点,您可以执行类似的操作(我需要进行后处理以在没有值的情况下添加一个值,以使数据正确):

    #!/bin/bash
    
    declare -A arrPartitionsToCheck=(
      [/run/media/my-backup]="/dev/sda1" # vfat
      [/run/media/my-data]="/dev/sdb1"   # ext4
    )
    
    ## store the file system types
    declare -A fileSystems="( $(lsblk -o PATH,FSTYPE | awk 'NF==1{$2="."}1' ) )"
    
    for part in "${!arrPartitionsToCheck[@]}"; do
    
      device=${arrPartitionsToCheck[$part]}
      fstype=${fileSystems[$device]}
    
      # Unmount
      # umount /dev/sda1
      umount "${arrPartitionsToCheck[$part]}"
      
      # Select the right variant of FSCK and repair automatically
      fsck."$fstype" -a "${arrPartitionsToCheck[$part]}"
      
      # Mont Again! For example
      # mount /dev/sda1 /run/media/my-backups
      mount "${arrPartitionsToCheck[$part]}" "$part"    
    
    done
    
    • 3
  2. Best Answer
    Marcus Müller
    2024-03-04T19:08:25+08:002024-03-04T19:08:25+08:00

    Bash 无法猜测文件系统类型。而且你不能真正询问 mount 本身,因为我怀疑检查的全部目的还包括事情稍微损坏并且文件系统无法自动安装的情况。

    fsck因此,如果没有安装一个可以检测文件系统本身(或使用/滥用自身)的成熟的文件系统file,您需要自己输入该信息。无论如何,这实际上不应该成为问题,因为您已经手动定义了块设备及其安装点!(这让人想知道为什么你不简单地依赖/etc/fstab并运行fsck -A。)

    您可以将文件系统的知识集成到关联数组中:

    declare -A arrPartitionsToCheck=(
    [/run/media/my-backup]="fsck.vfat:/dev/sda1"
    [/run/media/my-data]="fsck.ext4:/dev/sdb1"
    [swap]="true:/dev/sdb9" #swap, don't check
    )
    

    并在迭代中提取它:

    for mountpoint in "${!arrPartitionsToCheck[@]}"; do
        spec="${arrPartitionsToCheck[$mountpoint]}"
        tool="${spec%:*}"
        device="${spec#*:}"
        # Unmount
        # umount /dev/sda1
        umount "${device}"
    
        # Select the right variant of FSCK and repair automatically
        "${tool}" -a "${device}"
    
        # Mount Again! For example
        # mount /dev/sda1 /run/media/my-backups
        mount "${device}" "${mountpoint}"
    done
    

    (我将您的重命名$part为$mountpoint,因为part这确实具有误导性;那是挂载点,而不是分区。)

    您可以执行类似操作mount -t "${type}",从字符串中提取类型fsck.TYPE(如果存在),如果不存在则不安装。

    • 2

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve