Ну, вы думаете, что не показали все свои переменные (нет ссылки на то, где _First_Second
set), но я думаю так:
${!_thisVarNam[${ctX}]+x}
считывает значение _thisVarNam[${ctX}]
и использует его как имя переменной. Это не то же самое, что взять значение _thisVarNam
, использовать его в качестве имени массива, а затем проиндексировать этот массив.
Давайте посмотрим:
$ P=(somevar othervar);
$ somevar=foo; unset othervar
$ i=0; echo "${!P[i]-unset}" # reads somevar
foo
$ i=1; echo "${!P[i]-unset}" # reads othervar (not set)
unset
$ q="P[0]"; echo "${!q}" # reads P[0]
somevar
$ q="P[1]"; echo "${!q}" # reads P[1]
othervar
$ arrayname=P; i=1
$ q="$arrayname[$i]" # this is just a string so same as above
$ echo "${!q}" # still P[1]
othervar
Итак, если _thisVarNam
содержит имя массива, и вы хотите проверить, не установлен ли элемент этого массива, вам нужно сделать что-то вроде этого:
p="$_thisVarNam[${ctX}]"
if [ -z "${!p+x}" ] ; then ...
Кроме того, в Bash вы можете использовать declare
для косвенной установки переменной, нет необходимости в полной силе eval
:
$ arrayname=P; i=19
$ declare "$arrayname[$i]"=qwerty
$ echo "${P[19]}"
qwerty
Хотя большинство руководств советуют использовать chainloader +1
для цепной загрузки, у меня это не сработало.
Следующая конфигурация помогла:
insmod ufs2
set root=(hd0,gpt4)
chainloader /boot/loader.efi
У меня была такая же проблема на моей стороне с тем же ноутбуком (lenovo X220 с 2 жесткими дисками, один для системы/один для данных) и FreeBSD 10. Одним из решений для меня было:
Мой grub.cfg
прост (и хорошо работает уже много лет):
menuentry 'FreeBSD' {
insmod bsd
insmod ufs2
set root='hd0,msdos3'
kfreebsd /boot/loader
}
Я просто использую загрузчик FreeBSD для запуска ядра FreeBSD (с некоторыми пользовательскими настройками в моем loader.conf). Если вы попытаетесь загрузиться напрямую с опцией kfreebsd
на ядре FreeBSD, вам придется много чего настраивать.
BTW, вы читали официальную документацию FreeBSD по мультизагрузке env с grub2?