在bash case语句中使用文件路径
我试图在在bash case语句中使用文件路径,bash,case-statement,Bash,Case Statement,我试图在part\u arr数组元素上执行以下脚本循环,具体取决于脚本应执行命令的值。在本例中,我只使用了echo语句。它似乎无法检测路径part\u arr是以/或[开头的每个分区的大小和路径 part_arr=$(lsblk -b | awk '/.*[\/\[].*/{ print $4, $7 }') tmp='' for i in "${part_arr[@]}"; do case "$i" in "/boot/efi" ) echo $i
part\u arr
数组元素上执行以下脚本循环,具体取决于脚本应执行命令的值。在本例中,我只使用了echo
语句。它似乎无法检测路径part\u 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
这里有一种替代方法,通过使用易于编辑的数组来删除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
!/bin/bash
部分arr=($(lsblk-b | awk'/.[\/\[]./{print$4,$7}'))
有趣的=(
'/'
“/boot”
“/boot/efi”
“/etc/hosts”
“/家”
“/media/ebs0”
“/tmp”
“/var”
“[交换]”
)
#每个条目都是成对的:(大小、文件名)。
对于((i=0;i这里有一种替代方法,通过使用易于编辑的数组来删除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
!/bin/bash
部分arr=($(lsblk-b | awk'/.[\/\[]./{print$4,$7}'))
有趣的=(
'/'
“/boot”
“/boot/efi”
“/etc/hosts”
“/家”
“/media/ebs0”
“/tmp”
“/var”
“[交换]”
)
#每个条目都是成对的:(大小、文件名)。
对于((i=0;ipart\u arr
不是数组,它是一个字符串。您是否缺少命令替换周围的()
?谢谢@BenjaminW。我需要以下命令:part\u arr=($(lsblk-b | awk'/.[\/\[]./{print$4,$7}'))
。您可以提供下面的解决方案。part\u arr
不是数组,而是单个字符串。您是否缺少命令替换的()
?谢谢@BenjaminW。我需要以下解决方案:part\u arr=($(lsblk-b | awk'/.[\/\[]./{print$4,$7}'))
。您可以提供下面的解决方案。