私のスクリプトのelifロジックに関するいくつかのBashヘルプ

私のスクリプトのelifロジックに関するいくつかのBashヘルプ

したがって、ここのスクリプトの一部は、各ドライブを手動で確認する必要なく、NVMeがどのように機能し実行されるかを理解するのに役立つようにボードのPCIeレーンを読み取ることです。これはほとんどの場合うまくいきますが、bashの知識が不足していて、代わりに何を使うべきかわかりません。

    elif [[ ! "10000:01:00.0" =~ "${V2Lnvmearray[$key]}" ]]

これは、ドライブがない場合だけでなく、ドライブがあり、他の検索が一致しない場合にも当てはまります。その結果、8つの「ドライブが検出されない」数または7つの「ドライブが検出されない」数とスロットごとに1つの陽性数が生成されます。コメントありがとうございます。

#!/bin/bash

V2Lnvme0n1=$( readlink -f /sys/dev/block/$(ls -l /dev/nvme0n1 |awk -F'[, ]+' '{print $5":"$6}') |grep -Eo '1000+[0-4]+[:]+[0]+[1-4]+[:]+[0]+[.]+[0]+' )
V2Lnvme1n1=$( readlink -f /sys/dev/block/$(ls -l /dev/nvme1n1 |awk -F'[, ]+' '{print $5":"$6}') |grep -Eo '1000+[0-4]+[:]+[0]+[1-4]+[:]+[0]+[.]+[0]+' )
V2Lnvme2n1=$( readlink -f /sys/dev/block/$(ls -l /dev/nvme2n1 |awk -F'[, ]+' '{print $5":"$6}') |grep -Eo '1000+[0-4]+[:]+[0]+[1-4]+[:]+[0]+[.]+[0]+' )
V2Lnvme3n1=$( readlink -f /sys/dev/block/$(ls -l /dev/nvme3n1 |awk -F'[, ]+' '{print $5":"$6}') |grep -Eo '1000+[0-4]+[:]+[0]+[1-4]+[:]+[0]+[.]+[0]+' )
V2Lnvme4n1=$( readlink -f /sys/dev/block/$(ls -l /dev/nvme4n1 |awk -F'[, ]+' '{print $5":"$6}') |grep -Eo '1000+[0-4]+[:]+[0]+[1-4]+[:]+[0]+[.]+[0]+' )
V2Lnvme5n1=$( readlink -f /sys/dev/block/$(ls -l /dev/nvme5n1 |awk -F'[, ]+' '{print $5":"$6}') |grep -Eo '1000+[0-4]+[:]+[0]+[1-4]+[:]+[0]+[.]+[0]+' )
V2Lnvme6n1=$( readlink -f /sys/dev/block/$(ls -l /dev/nvme6n1 |awk -F'[, ]+' '{print $5":"$6}') |grep -Eo '1000+[0-4]+[:]+[0]+[1-4]+[:]+[0]+[.]+[0]+' )
V2Lnvme7n1=$( readlink -f /sys/dev/block/$(ls -l /dev/nvme7n1 |awk -F'[, ]+' '{print $5":"$6}') |grep -Eo '1000+[0-4]+[:]+[0]+[1-4]+[:]+[0]+[.]+[0]+' )
declare -A V2Lnvmearray=( [nvme0n1]=$V2Lnvme0n1 [nvme1n1]=$V2Lnvme1n1 [nvme2n1]=$V2Lnvme2n1 [nvme3n1]=$V2Lnvme3n1 [nvme4n1]=$V2Lnvme4n1 [nvme5n1]=$V2Lnvme5n1 [nvme6n1]=$V2Lnvme6n1 [nvme7n1]=$V2Lnvme7n1 )
#V2Large Machines setup | get the PCIe address into the array
for key in "${!V2Lnvmearray[@]}"; do
    echo "$key ${V2Lnvmearray[$key]}"; done # displays the keys and values of the array
for key in "${!V2Lnvmearray[@]}"; do
    if [[ "10000:01:00.0" = "${V2Lnvmearray[$key]}" ]]; then
        echo "$key is in slot 0"
    elif [[ ! "10000:01:00.0" =~ "${V2Lnvmearray[$key]}" ]]; then
        echo "No drive detected in slot 0"
    fi
    if [[ "10000:02:00.0" = "${V2Lnvmearray[$key]}" ]]; then
        echo "$key is in slot 1"
    elif [[ ! "10000:02:00.0" =~ "${V2Lnvmearray[$key]}" ]]; then
        echo "No drive detected in slot 1"
    fi
    if [[ "10002:01:00.0" = "${V2Lnvmearray[$key]}" ]]; then
        echo "$key is in slot 2"
    elif [[ ! "10002:01:00.0" =~ "${V2Lnvmearray[$key]}" ]]; then
        echo "No drive detected in slot 2"
    fi
    if [[ "10002:02:00.0" = "${V2Lnvmearray[$key]}" ]]; then
        echo "$key is in slot 3"
    elif [[ ! "10002:02:00.0" =~ "${V2Lnvmearray[$key]}" ]]; then
        echo "No drive detected in slot 3"
    fi
    if [[ "10001:01:00.0" = "${V2Lnvmearray[$key]}" ]]; then
        echo "$key is in slot 4"
        elif [[ ! "10001:01:00.0" =~ "${V2Lnvmearray[$key]}" ]]; then
        echo "No drive detected in slot 4"
    fi
    if [[ "10001:02:00.0" = "${V2Lnvmearray[$key]}" ]]; then
        echo "$key is in slot 5"
    elif [[ ! "10001:02:00.0" =~ "${V2Lnvmearray[$key]}" ]]; then
        echo "No drive detected in slot 5"
    fi
    if [[ "10001:03:00.0" = "${V2Lnvmearray[$key]}" ]]; then
        echo "$key is in slot 6"
    elif [[ ! "10001:03:00.0" =~ "${V2Lnvmearray[$key]}" ]]; then
        echo "No drive detected in slot 6"
    fi
    if [[ "10001:04:00.0" = "${V2Lnvmearray[$key]}" ]]; then
        echo "$key is in slot 7"
    elif [[ ! "10001:04:00.0" =~ "${V2Lnvmearray[$key]}" ]]; then
        echo "No drive detected in slot 7"
    fi
    done

答え1

なぜ私たちはまだこのようなことをするのでしょうか?だけでなくls悪いアイデアの結果を分析します。、インストールすることもインストールされない可能性があるNVMEデバイスの詳細を探しています。 statおよび/findまたは比率ls -l

そこから必要なものを入手する方が簡単ではないでしょうかfind /sys/devices/pci* -name 'nvme[0-9]*n1'?これにより、/sys/devices へのフルパスが提供されます。ただnvmeドライバが実際にシステムにインストールされました。

配列に入れるには:

$ readarray -d '' -t nvme  < <(
    find /sys/devices/pci*/ -name 'nvme[0-9]*n1' -print0)

$ declare -p nvme
declare -a nvme=(
 [0]="/sys/devices/pci0000:40/0000:40:01.2/0000:42:00.0/nvme/nvme1"
 [1]="/sys/devices/pci0000:40/0000:40:01.1/0000:41:00.0/nvme/nvme0")

declare -p(読みやすくするために出力に改行を追加します。)

ベース名でインデックス付けされた連想配列(ハッシュとも呼ばれる)に入れたい場合:

$ readarray -d '' -t nvme  < <(
    find /sys/devices/pci*/  -name 'nvme[0-9]*n1' -print0)

$ for d in "${nvme[@]}" ; do
   nvme_hash["$(basename "$d")"="$d"
done

$ declare -p nvme_hash
declare -A nvme_hash=(
 [nvme1n1]="/sys/devices/pci0000:40/0000:40:01.2/0000:42:00.0/nvme/nvme1/nvme1n1"
 [nvme0n1]="/sys/devices/pci0000:40/0000:40:01.1/0000:41:00.0/nvme/nvme0/nvme0n1" )

または、パスの5番目の要素だけが必要な場合:

$ for d in "${nvme[@]}" ; do
  nvme_hash["$(basename "$d")"]="$(printf "$d" | awk -F/ '{print $5}')"
done

$ declare -p nvme_hash
declare -A nvme_hash=([nvme1n1]="0000:40:01.2" [nvme0n1]="0000:40:01.1" )

ドライブが「欠けている」かどうかを直接伝えることはできませんが、インストールされているすべてのnvmeドライブの完全なリストを提供しているため、ドライブが欠落しているかどうかを推論するために使用できます。 8つのNVMEデバイスが予想されますが、ハッシュに7つの要素しかない場合、1つの要素がありません。あるいは、nvme [0-7] n1をインストールしようとしていますが、3と5が見つからない場合は、ハッシュキーを繰り返してそれを見つけることができます。

この/sys/devices/...パスを使用すると、nvmeドライブに関する完全な情報にアクセスできます。

簡単に言うと、ハードコーディングされたリストから始めて、これを逆さまに実行することです。可能何かを発見するのではなく、存在するために実際にそこに。

関連情報