我并不是一名经验丰富的程序员。所以也许您很清楚为什么此脚本中的 break 命令不会终止循环,但我看不出是什么导致了这个问题。我想使用该脚本将 VHD 文件安装到第一个空的 NBD“插槽”(当其大小为零时假定为空,我从此站点上的另一个帖子中获得了这个想法)。
function vhdmount() {
workfile="$1"
if test -e "$workfile"
then
workname=${workfile##*'/'}
echo "$(tput setaf 3)*** ${workfile}: ***$(tput setaf 7)"
for (( i=0; i<16; i++ ))
do (
if test -e /sys/class/block/nbd${i}/size
then
usedornot=$( cat /sys/class/block/nbd${i}/size )
if (( "$usedornot" == 0 ))
then
firstfree=$i
break
fi
else
firstfree=$i
break
fi
); done
sudo modprobe nbd
sudo qemu-nbd -c /dev/nbd${firstfree} "$workfile"
sudo mkdir "/media/myusername/${workname//.vhd/.nbd${firstfree}}/"
sudo mount /dev/nbd${firstfree}p1 "/media/myusername/${workname//.vhd/.nbd${firstfree}}/"
echo "$(tput setaf 3) successfully mounted.$(tput setaf 7)"
fi
}
vhdmount "$1"
也许还有其他错误。当 shell 要求输入密码时,我总是会终止它,因为我可以从 16 条消息中看出 break 命令仅在 for 循环中有用,而 break 命令不起作用。顺便说一句,这是一条多么没用的错误消息啊?!
该错误是由于在 中使用了子 shell 造成的
for
。GNU Bash 参考手册指出:这个错误信息实际上非常有用,因为它提供了一个线索,表明存在
break
循环外部(因为它在子 shell 中)。作为一般建议,您可以使用shellcheck实用程序或https://www.shellcheck.net/检查代码中是否存在一些常见错误。对于提供的代码,它会给出几个关于
firstfree
在子 shell 内部修改变量的警告,以及关于break
s 的警告。