내 스크립트의 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" )

또는 경로의 다섯 번째 요소만 원하는 경우:

$ 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개의 요소만 있는 경우 한 개의 요소가 누락됩니다. 또는 nvme[0-7]n1을 설치하려고 하는데 3과 5가 누락된 경우 해시 키를 반복하여 이를 찾을 수 있습니다.

/sys/devices/...경로를 통해 nvme 드라이브에 대한 전체 정보에 액세스할 수 있습니다.

간단히 말해서, 하드코딩된 목록부터 시작하여 이 작업을 거꾸로 수행하는 것입니다.가능한무언가를 발견하기보다는 존재하기 위해실제로거기.

관련 정보