在bash的case语句中使用文件路径
在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
使用文件路径在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语句,可以更方便地编辑和维护需要匹配的文件路径,使代码更加简洁和易读。