Почему нет ";" после "делать" в ш петлях?

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-alternativespara seleccionar la JVM predeterminada.

28
27.07.2019, 17:02
7 ответов

Потому что do — это ключевое слово, а то, что следует за ним, — это, по сути, параметры. Интерпретатор Bash знает, что далее следует больше. Это похоже на то, как нет ';' после i в команде for. На самом деле вы можете добавить новую строку после i в for и ввести остальное в новой строке, и все будет работать нормально.

1
27.01.2020, 19:38

Синтаксис:

for i in [whitespace separated list of values]
do [newline separated list of commands]
done

Любой символ новой строки в списке команд или перед «do» или «done» может быть заменен знаком «;».

Новая строка (, но не ";" )разрешено после "do" и перед "in", просто чтобы все выглядело лучше, но не имеет смысла требовать новой строки.

3
27.01.2020, 19:38

Я не знаю, какова первоначальная причина такого синтаксиса, но давайте учтем тот факт, что whileциклы могут принимать несколько команд в разделе условий, например.

while a=$(somecmd);
      [ -n "$a" ];
do
    echo "$a"
done

Здесь ключевое слово doнеобходимо, чтобы отличить раздел условия от основной части цикла. do— это ключевое слово, подобное while, if,thendone), и похоже, что оно соответствует другим тем, что не требует точки с запятой или новой строки после него, но появляется непосредственно перед команда.

Альтернатива (, обобщенная на ifи while), выглядела бы несколько уродливо, нам нужно было бы написать, например,.

if; [ -n "$a" ]; then
    some command here
fi

Синтаксис циклов forаналогичен.

13
27.01.2020, 19:38

ifпохож на его ключевые слова :это вполне читабельно, когда команды короткие:

if   test_commands
then true_commands
else false_commands
fi
3
27.01.2020, 19:38

Синтаксис оболочки основан на префиксах. В нем есть предложения, введенные специальными ключевыми словами. Некоторые пункты должны идти вместе.

Цикл 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.

11
27.01.2020, 19:38

Короткий ответ, потому что это определяется грамматикой оболочки 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.

3
27.01.2020, 19:38

Я бы сказал, что 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

Во всех этих местах ожидается список команд, поэтому начальный ;является неожиданным.

7
27.01.2020, 19:38

Теги

Похожие вопросы