Использование `;` в составных командах [закрыто]

-2
13.04.2017, 15:36
2 ответа

Самый основной строительный блок - это "простая команда" (LESS=+/'Simple Command' man bash)

Простые команды Простая команда - это ..., и завершается оператором управления.

Обычно таким управляющим оператором, завершающим простую команду, является запятая (;).

В большинстве строк, которые вы скопировали из руководства, запятая (;) используется в качестве завершающего управляющего символа. Например, в:

for name [ [in [words ...] ] ; ] do commands; done

и словами;, и командами; могут быть "простые команды", завершаемые ;. В этом простом примере:

for w in $(echo "a b c"); do echo $w; done

И echo "a b c", и echo $w являются простыми командами. Список, созданный командой echo "a b c", завершается символом ; (для определения конца списка).
Что не обязательно, это работает так же:

for   w in    $(echo "a b c")
do    echo $w
done

Единственная причина, по которой все [ [in [words ...] ] ; ] необязательны в цикле for, заключается в том, что в этом случае список элементов является списком "позиционных параметров" (которые могут быть установлены с помощью set):

$ set -- *
$ # for name [ [in [words ...] ] ; ] do commands; done
$   for f                            do echo $f; done

Если вы примените эту же концепцию построения "простых команд" к "сложным командам", большинство ваших вопросов окажутся ненужными.

  1. Почему пункты в команде case разделяются символами ;;, а не ;, которые используются в других командах?

Чтобы иметь возможность определить конец нескольких простых команд, заканчивающихся простыми символами ;.

    case b in ([a-d]) echo "yes"; cp filea fileb; rm filed; ;; esac

Или переписать для удобочитаемости:

    case b in
        ([a-d])
                echo "yes";
                cp filea fileb;
                rm filed;
        ;;
    esac
  1. В командах for и case, когда часть in игнорируется, почему следующие ; и ;; также игнорируются, а не остаются?

Использование in не является необязательным в пункте case.

2.2. Напротив, в команде select, ; не игнорируется, когда игнорируется часть in.

Часть [in words ...] завершается символом ;, когда список слов предоставляется выводом команды (ls *), Точно так же, как это используется в команде for.

2.3. Обратите внимание, что в команде case in не игнорируется следующая часть, а в команде for - игнорируется. Являются ли они произвольными непоследовательными конструкциями POSIX-оболочек?

Нет, никаких непоследовательностей, кроме тех, что порождены неполным пониманием команд.

  1. Какие маркеры ; и ;; используются в составных командах?

"Оператор управления"(ы), используемый для завершения одной или нескольких "Простых команд".

В составной команде { list; } почему между list и } должен быть ;?

Нет, не "должен быть", это правильный список:

[ 2 -lt 4 ] &&
{ echo "yes"
  echo "it is smaller"
}

"Смотри, ма!!! No (;)" Но для того, чтобы } стоял сам по себе, нужно использовать какой-то метасимвол (новую строку).

Да: [ 2 -lt 4 ] && { echo "yes"; echo "it is smaller"; } выглядит иначе.
Но это точно такая же команда.

Игнорируя часть о клаузулах (новое слово с собственным списком деталей).
Я их не считал, но более 10 вопросов про время, builtin, слова, токены и т.д. Может быть, вы попадете в подобную колею вопросов здесь?

Вы наконец-то поняли, что такое или не такое "Простая команда"?
Тогда вы можете подумать о "Составных командах", и только потом (после серьезных размышлений) о каком-то другом вопросе.

1
28.01.2020, 05:15

Чтобы ответить на вопрос о ;; vs. ; в операторах case, подумайте о том, что невозможно написать однострочную команду, в которой несколько команд выполнялись бы в одной ветви оператора case, если ; завершает определенную ветвь.

Вы все еще можете сделать это, используя многострочную команду, но разработка грамматики оболочки таким образом потребует многострочных команд, а в грамматике оболочки нет ни одного места, где многострочные команды (новые строки) были бы неизбежны. Использование ;;; для переключения регистров в конструкции shell позволяет добиться большей гибкости при написании кода.


Для сравнения case с for, while, until и if- все эти команды следуют за list с определенным зарезервированным словом в каждом случае использования. (then, elif, else, fi, do, done)

case, с другой стороны, следует за списком с "образцом", который может быть любым- желаемый образец может быть также именем допустимой команды.

2
28.01.2020, 05:15

Теги

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