Чтобы запустить виртуальный бокс, вам нужно загрузить в ядро несколько модулей. Либо у вас есть бинарные модули, соответствующие вашему ядру, либо вы можете скомпилировать их из исходного кода, соответствующего вашему ядру. Похоже, у вас нет модулей, и их компиляция либо не удалась, либо не предпринималась попыток.
В моей системе драйверы компилируются с
/usr/lib/virtualbox/vboxdrv.sh setup
Запустите эту команду вручную и посмотрите, что может быть не так.
Дело в том, что шаблон подстановочных знаков расширяется до нескольких аргументов, а не только до одного аргумента в $1
. Остальные находятся в $2
, $3
и т. д. Вы не можете индексировать те, у которых есть стандартные функции оболочки, но обычно вам не нужно :вы можете получить доступ к списку аргументов скрипта с помощью "$@"
. Так:
if [ "$#" -eq 0 ]; then
echo "no arguments"
else
echo "$# arguments:"
for x in "$@"; do
echo " $x" # or do whatever with $x
done
fi
Что-то вроде cp -- "$@" /var/tank/awaiting/
, в свою очередь, вызовет cp
с файлами, полученными сценарием в качестве аргументов. --
предотвращает использование любых следующих аргументов в качестве опций для cp
.
Если вы вызываете скрипт с:
$ script.sh file*.txt
и если есть совпадения, то оболочка расширит этот глобус до списка совпадений файлов. Предположим, например, что у вас есть file1.txt
, file2.txt
и file3.txt
, тогда приведенная выше команда эквивалентна:
$ script.sh file1.txt file2.txt file3.txt
Порядок может отличаться, но здесь это не важно.
Одним из вариантов обработки файлов в этом случае является цикл, подобный:
while [[ $# -ne 0 ]]; do
# process ${1}
shift
done
shift
отбросит старые ${1}
и сдвинет оставшиеся параметры "влево" на единицу (2 станет 1, 3 станет 2 и т. д. ). shift
также обновляет $#
.
Например:
#!/bin/bash
while [[ $# -ne 0 ]]; do
echo ${1}
shift
done
Если я запущу этот скрипт, я увижу:
$./script.sh a b c
a
b
c
$