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

时间:2018-08-22 15:11:21

标签: bash case-statement

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

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

tmp=''

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

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

    tmp=i

done

1 个答案:

答案 0 :(得分:2)

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

#!/bin/bash
part_arr=($(lsblk -b | awk '/.*[\/\[].*/{ print $4, $7 }'))
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