在 bash case 语句中使用文件路径

Using file paths in bash case statement

我正在尝试使以下脚本在 part_arr 数组元素上循环,并根据脚本应执行命令的值。在这种情况下,我只使用了 echo 语句。它似乎没有检测到路径。 part_arr 是以 /[ 开头的每个分区的大小和路径。

part_arr=$(lsblk -b | awk '/.*[\/\[].*/{ print ,  }')

tmp=''

for i in "${part_arr[@]}"; do

    case "$i" in
    "/boot/efi" )
        echo $i     $tmp;;
    "/boot" )
        echo $i     $tmp;;
    "/var")
        echo      $tmp;;
    "/tmp")
        echo      $tmp;;
    "/home")
        echo      $tmp;;
    "[SWAP]")
        echo      $tmp;;
    "/")
        echo      $tmp;;
    esac

    tmp=i

done

这是一种替代方法,它通过使用易于编辑的数组来消除 case 语句。它可能会使维护稍微容易一些。

#!/bin/bash
part_arr=($(lsblk -b | awk '/.*[\/\[].*/{ print ,  }'))
interesting=(
    '/'
    '/boot'
    '/boot/efi'
    '/etc/hosts'
    '/home'
    '/media/ebs0'
    '/tmp'
    '/var'
    '[SWAP]'
)
# Each entry is pair: (size, file-name).
for((i=0; i<${#part_arr[@]}; i+=2)) ; do
    fname=${part_arr[(($i+1))]}
    # O(log(N)) search is okay here because N is small.
    for j in ${interesting[@]} ; do
        if [[ "$j" == "$fname" ]] ; then
            fsize=${part_arr[$i]}
            printf '%-12s %s\n' $fname $fsize
            break
        fi
    done
done