ルックアップテーブルまたはデータ構造を作成してBashで繰り返す方法

ルックアップテーブルまたはデータ構造を作成してBashで繰り返す方法

私は組み込みLinux用に開発中です。パーティションを自動的に回復するbashスクリプトを作成したいと思います。

キーがマウントポイントであり、値がマウントされるデバイスである連想配列を宣言しました。

私の質問は、デバイスに異なるファイルシステムがある可能性があるため、fsck正しいバージョンを選択する必要があることです。

各ファイルシステムには、fsckなどの独自のバリエーションがあります。fsck.vfatfsck.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

ベストアンサー1

からファイルシステムの種類を取得できます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

おすすめ記事