我试图使以下脚本在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 :(得分: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