Другой способ сделать это - назвать параметр, который вы хотите объявить, а затем сделать это:
{ cat >./foo
chmod +x ./foo
eight=declared ./foo
eight=declared_and_preferred \
./foo 1 2 3 4 5 6 7 8
./foo 1 2 3 4 5 6 7 8
./foo
} <<\SCRIPT
#!/usr/bin/sh
: ${eight:=${8:-some_default}}
printf '$eight = %s\n' "$eight"
#END
SCRIPT
$eight = declared
$eight = declared_and_preferred
$eight = 8
$eight = some_default
В приведенном выше примере явно объявленная переменная окружения предпочтительнее аргумента командной строки, но аргумент командной строки используется, когда переменная окружения либо пуста, либо не задана. Когда и 8-я позиция , и переменная окружения $eight
пуста или отменяется, значение по умолчанию some_default присваивается $eight
. В любом случае :
может быть удалено из операторов :-
или :=
, если пустое значение должно быть приемлемым.
Переменная $eight
с тем же успехом могла бы быть установлена как:
printf '$eight = %s\n' "${eight:=${8:-some_default}}"
... и предыдущая строка опущена полностью, но я хотел продемонстрировать, что объявление переменной таким образом действительно приводит к постоянному значению, и поэтому я сделал это в двух командах. В любом случае $8
устанавливается конечное значение этого составного расширения параметра.
getopts
- для робастных скриптов - часто является лучшим способом обработки опций команд . Позиционные параметры, с другой стороны, почти всегда являются самым простым средством робастной обработки операндов в сценарии.
Например:
touch file$(seq -ws\ file 100)
./foo *
$eight = file008
Там мы видим только восьмой операнд, но есть 101 из них в глобусе из моего тестового каталога.
Это потому, что эти программы являются частью чашек , разработанных Apple.
То, что программа ( номер люкс) является открытым исходным кодом, не означает, что разработчик или компания (частично), оплачивающая разработку, не могут претендовать на авторские права на свои усилия.
-121--154438- Функция current-message
возвращает сообщение, отображаемое в данный момент в области эха , если таковое имеется. Ее можно вставить с помощью (вставить (текущее сообщение))
. Однако все, что заставляет что-либо другое занимать эхо-область, приведет к тому, что current-message
возвратит nil
.
Сообщения от Emacs архивируются в буфере * Messages *
. Было бы полезнее захватить оттуда последнюю строчку. Это не совсем надежно, так как возможно иметь многострочное сообщение, но это редко: функция message
предназначена для коротких сообщений, которые помещаются в одну строку.
Следующая функция вставляет последнее сообщение (точнее, последнюю строку из буфера * Messages *
. При использовании аргумента префикса он возвращает более старые сообщения: 1 для последнего сообщения, 2 для следующего сообщения и т.д. Аргумент 0 вставляет (текущее сообщение)
, если имеется.
(defun last-message (&optional num)
(or num (setq num 1))
(if (= num 0)
(current-message)
(save-excursion
(set-buffer "*Messages*")
(save-excursion
(forward-line (- 1 num))
(backward-char)
(let ((end (point)))
(forward-line 0)
(buffer-substring-no-properties (point) end))))))
(defun insert-last-message (&optional num)
(interactive "*p")
(insert (last-message num)))
Свяжите его с ключом обычным способом. Например, если вы хотите, чтобы команда всегда была доступна на C-c m
:
(global-set-key "\C-cm" 'insert-last-message)
Возможно, проще, чем вызвать две пользовательские команды для вставки имени файла, см. Emacs wiki .
Чтобы вставить выходные данные вычисления фрагмента Lisp с помощью C-x C-e
, передайте аргумент префикса C-u C-x C-e
.
Предположим, что сценарий можно изменить, вместо обязательных параметров (аргументов) следует использовать дополнительные параметры (параметры).
Если у вас есть каждый из первых 7 семи параметров в качестве опций, и они по умолчанию пустые последовательности то можно просто сделать:
./foo bar
Если вы используете POSIX-совместимую оболочку , вы можете использовать утилиту getopts
или программу getopt
. bash
- как и большинство оболочек - предлагает getopts
в качестве встроенного. Любой способ проще, чем свернуть собственный синтаксический анализатор командной строки.
Если вы не реализуете что-то вроде последних X непозиционных аргументов являются значениями для последних Y аргументов и X-Y опционных аргументов, вы должны предоставить последовательности опций перед каждой из 7 (теперь пустых) последовательностей, если вы хотите установить любой из них. Однако это не является обычной практикой, обычно вариант всегда является вариантом, а аргумент - аргументом, и порядок «вставки» варианта является свободным.