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

19 浏览
0 Comments

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

我正在尝试使以下脚本循环遍历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

0
0 Comments

使用文件路径在bash case语句中的问题是,当需要匹配的文件路径较多时,case语句会变得冗长且难以维护。为了解决这个问题,可以使用数组来替代case语句,这样可以更容易地进行编辑和维护。

下面是一个解决这个问题的示例代码:

#!/bin/bash
part_arr=($(lsblk -b | awk '/.*[\/\[].*/{ print $4, $7 }'))
interesting=(
    '/'
    '/boot'
    '/boot/efi'
    '/etc/hosts'
    '/home'
    '/media/ebs0'
    '/tmp'
    '/var'
    '[SWAP]'
)
# 每个条目都是一个键值对:(size, file-name)。
for((i=0; i<${#part_arr[@]}; i+=2)) ; do
    fname=${part_arr[(($i+1))]}
    # O(log(N)) 搜索在这里是可以接受的,因为N很小。
    for j in ${interesting[@]} ; do
        if [[ "$j" == "$fname" ]] ; then
            fsize=${part_arr[$i]}
            printf '%-12s %s\n' $fname $fsize
            break
        fi
    done
done

这段代码首先通过`lsblk -b`命令获取文件路径和文件大小的信息,并使用awk命令进行提取和过滤,将结果存储在`part_arr`数组中。

然后,定义了一个包含需要匹配的文件路径的`interesting`数组。

接下来,使用两层循环遍历`part_arr`数组和`interesting`数组,通过比较文件路径来找到匹配的文件路径,并输出文件路径和文件大小。

通过使用数组来代替case语句,可以更方便地编辑和维护需要匹配的文件路径,使代码更加简洁和易读。

0