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