La mejor manera de instalar Java 6 JDK de Oracle es proceder de la siguiente manera:
instalarjava-package
:
apt-get install java-package
descargarjdk-6u45-linux-i586.bin
(no el RPM )de el Oracle logra ;
crear el paquete Debian correspondiente:
make-jpkg jdk-6u45-linux-i586.bin
instalar el paquete resultante:
sudo dpkg -i oracle-java6-jdk_6u45_i386.deb
Esto se encargará de configurar alternativas, etc. para que pueda reemplazar completamente cualquier JVM instalada. Si desea mantener varias JVM instaladas, utilice update-java-alternatives
para seleccionar la JVM predeterminada.
Потому что do — это ключевое слово, а то, что следует за ним, — это, по сути, параметры. Интерпретатор Bash знает, что далее следует больше. Это похоже на то, как нет ';' после i в команде for. На самом деле вы можете добавить новую строку после i в for и ввести остальное в новой строке, и все будет работать нормально.
Синтаксис:
for i in [whitespace separated list of values]
do [newline separated list of commands]
done
Любой символ новой строки в списке команд или перед «do» или «done» может быть заменен знаком «;».
Новая строка (, но не ";" )разрешено после "do" и перед "in", просто чтобы все выглядело лучше, но не имеет смысла требовать новой строки.
Я не знаю, какова первоначальная причина такого синтаксиса, но давайте учтем тот факт, что while
циклы могут принимать несколько команд в разделе условий, например.
while a=$(somecmd);
[ -n "$a" ];
do
echo "$a"
done
Здесь ключевое слово do
необходимо, чтобы отличить раздел условия от основной части цикла. do
— это ключевое слово, подобное while
, if
,then
(и done
), и похоже, что оно соответствует другим тем, что не требует точки с запятой или новой строки после него, но появляется непосредственно перед команда.
Альтернатива (, обобщенная на if
и while
), выглядела бы несколько уродливо, нам нужно было бы написать, например,.
if; [ -n "$a" ]; then
some command here
fi
Синтаксис циклов for
аналогичен.
if
похож на его ключевые слова :это вполне читабельно, когда команды короткие:
if test_commands
then true_commands
else false_commands
fi
Синтаксис оболочки основан на префиксах. В нем есть предложения, введенные специальными ключевыми словами. Некоторые пункты должны идти вместе.
Цикл while
состоит из одной или нескольких тестовых команд.:
test ; test ; test ;...
и одной или несколькими командами тела:
body ; body ; body ;...
Что-то должно сообщить оболочке, что начинается цикл while. В этом смысл while
слова:
while test ; test ; test ;...
Но тогда все неоднозначно. Какая команда является началом тела? Что-то должно указывать на это, и именно это делает префикс do
:
do body ; body ; body ;...
и, наконец, что-то должно указывать на то, что видели последнее тело; для этого используется специальное ключевое слово done
.
Эти ключевые слова оболочки не требуют разделения точкой с запятой даже в одной строке. Например, если вы закрываете несколько вложенных циклов, вы можете просто done done done...
.
Скорее точка с запятой ставится между ... test ; body...
, если они находятся на одной строке. Эта точка с запятой понимается как терминатор :, она принадлежит к test
. Следовательно, если между ними вставлено ключевое слово do
, оно должно располагаться между точкой с запятой и body
. Если бы он был по другую сторону точки с запятой, он был бы ошибочно встроен в синтаксис команды test
, а не помещен между командами.
Синтаксис оболочки был первоначально разработан Стивеном Борном и вдохновлен Algol . Борн так любил Алгол, что использовал множество макросов C в исходном коде оболочки, чтобы сделать C похожим на Алгол. Вы можете просмотреть исходные коды оболочки, датированные 1979 годом -, из версии 7 Unix . Макросы находятся в mac.h
, и они используются повсеместно. Например, операторы if
отображаются как IF
... ELSE
... ELIF
... FI
.
Короткий ответ, потому что это определяется грамматикой оболочки POSIX . Все, что находится между do
и done
, считается группой операторов, а ;
— последовательным разделителем :
for_clause : For name do_group
| For name sequential_sep do_group
| For name linebreak in sequential_sep do_group
| For name linebreak in wordlist sequential_sep do_group
do_group : Do compound_list Done
sequential_sep : ';' linebreak
| newline_list
Кроме того, если бы ;
было необходимо, стандарт бы прямо указал это и включил бы sequential_sep
после Do
.
Я бы сказал, что do
здесь не особенный. Вы получаете сообщение об ошибке, потому что ;
не может запустить список команд. Если бы это было так, то первая команда была бы пустой, а грамматика не допускает пустых команд (присвоения переменных или перенаправления без команды, да, но абсолютно ничего, нет ). Это верно в любом количестве мест, где ожидается список команд :
$ while true; do ; echo foo; done
dash: 1: Syntax error: ";" unexpected
$ while ; true; do; echo; done
dash: 1: Syntax error: ";" unexpected
$ { ; echo foo; }
dash: 1: Syntax error: ";" unexpected
$ if ; true; then echo foo; fi
dash: 1: Syntax error: ";" unexpected
Эвен:
$ ; ;
dash: 1: Syntax error: ";" unexpected
Во всех этих местах ожидается список команд, поэтому начальный ;
является неожиданным.