Самый основной строительный блок - это "простая команда" (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
Если вы примените эту же концепцию построения "простых команд" к "сложным командам", большинство ваших вопросов окажутся ненужными.
- Почему пункты в команде 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
- В командах
for
иcase
, когда частьin
игнорируется, почему следующие;
и;;
также игнорируются, а не остаются?
Использование in не является необязательным в пункте case.
2.2. Напротив, в команде
select
,;
не игнорируется, когда игнорируется часть in.
Часть [in words ...]
завершается символом ;
, когда список слов предоставляется выводом команды (ls *), Точно так же, как это используется в команде for
.
2.3. Обратите внимание, что в команде
case
in
не игнорируется следующая часть, а в командеfor
- игнорируется. Являются ли они произвольными непоследовательными конструкциями POSIX-оболочек?
Нет, никаких непоследовательностей, кроме тех, что порождены неполным пониманием команд.
- Какие маркеры
;
и;;
используются в составных командах?
"Оператор управления"(ы), используемый для завершения одной или нескольких "Простых команд".
В составной команде
{ list; }
почему междуlist
и}
должен быть;
?
Нет, не "должен быть", это правильный список:
[ 2 -lt 4 ] &&
{ echo "yes"
echo "it is smaller"
}
"Смотри, ма!!! No (;)"
Но для того, чтобы }
стоял сам по себе, нужно использовать какой-то метасимвол (новую строку).
Да: [ 2 -lt 4 ] && { echo "yes"; echo "it is smaller"; }
выглядит иначе.
Но это точно такая же команда.
Игнорируя часть о клаузулах (новое слово с собственным списком деталей).
Я их не считал, но более 10 вопросов про время
, builtin, слова, токены и т.д. Может быть, вы попадете в подобную колею вопросов здесь?
Вы наконец-то поняли, что такое или не такое "Простая команда"?
Тогда вы можете подумать о "Составных командах", и только потом (после серьезных размышлений) о каком-то другом вопросе.
Чтобы ответить на вопрос о ;;
vs. ;
в операторах case
, подумайте о том, что невозможно написать однострочную команду, в которой несколько команд выполнялись бы в одной ветви оператора case, если ;
завершает определенную ветвь.
Вы все еще можете сделать это, используя многострочную команду, но разработка грамматики оболочки таким образом потребует многострочных команд, а в грамматике оболочки нет ни одного места, где многострочные команды (новые строки) были бы неизбежны. Использование ;;;
для переключения регистров в конструкции shell позволяет добиться большей гибкости при написании кода.
Для сравнения case
с for
, while
, until
и if
- все эти команды следуют за list
с определенным зарезервированным словом в каждом случае использования. (then
, elif
, else
, fi
, do
, done
)
case
, с другой стороны, следует за списком с "образцом", который может быть любым- желаемый образец может быть также именем допустимой команды.