От/www.vrplumber.com/programming/runsnakerun/существует также этот прохладный сценарий Python
bzr branch lp:~mcfletch/squaremap/trunk squaremap
Это не является самым многофункциональным, но это выполняется из единственного сценария Python, таким образом, это чрезвычайно портативно.
Давайте разломаем это на части.
Этот код выполняет команду :
с некоторыми аргументами. Команда :
ничего не делает и игнорирует его аргументы. Поэтому целая командная строка делает ничего, кроме любых побочных эффектов не происходит в аргументах.
Синтаксис ${parameter_name:=value}
существует во всех нестаринных оболочках стиля Границы, включая пепел, удар, ksh и zsh. Это устанавливает параметр на значение по умолчанию при необходимости. Это эквивалентно
if [ -z "$parameter_name" ]; then parameter_name=value; fi
… ${parameter_name}
Другими словами, если parameter_name
не установлен или установлен на пустое значение, затем устанавливает его на указанное значение; и затем выполненный команда, с помощью нового значения параметра. Существует вариант, ${parameter_name=value}
, который оставляет параметр пустым, если это было пусто, только с помощью указанного значения, если параметр был сброшен.
Вы найдете этот синтаксис зарегистрированным при “расширении параметра” в спецификацию POSIX, и тире, удар, ksh и zsh руководства.
Существуют вариации на этот синтаксис в особенности ${parameter_name:-value}
которые позволяют Вам использовать значение по умолчанию для этого расширения только, не присваивая параметру.
Таким образом, : ${parameter_name:=value}
краткий способ записать
if [ -z "$parameter_name" ]; then parameter_name=value; fi
:
не означает верный - Вы, вероятно, думаете while :
, но даже в том выражении это не означает "верный", это просто происходит, оценивают к нему (на самом деле, это - просто пустая команда или noop).
Это расширение параметра (${x:=y}
) означает, "присваивают y x, если x сброшен или пуст, и расширяться до y".
$ echo "${foo:=bar}"
bar
$ foo=baz
$ echo "${foo:=bar}"
baz
$ foo=
$ echo "${foo:=bar}"
bar
$ echo "${foo}"
bar
У Хакеров Bash Wiki есть хорошая статья о расширении параметра здесь.
Причина это :
используется то, так, чтобы, пока другие части команды оценены, на них не реагировали (как :
пустая команда). Таким образом Вы имеете ${x:=y}
выполните его функцию, не влияя ни на что больше, например, если Вы не имели :
вначале, это попыталось бы выполнить команду, названную y.
Вот bash
страница справки на :
:
:: :
Null command.
No effect; the command does nothing.
Exit Status:
Always succeeds.
Первое :
команда, она назвала "noop" или "никакую операцию". Как сказано в странице справочника, это часто используется для оценки аргументов.
Второе :
спецификатор в переменном расширении - технически это :=
. Который, как сказано, это устанавливает значение, если оно не имеет значения.
Мудрый идиомой при необходимости в значении по умолчанию переменной среды, затем можно использовать этот синтаксис. Например, при прокручивании программы cron(8)
, среда не установлена и и точечные файлы оболочки не выполняются. Таким образом, Вы, возможно, должны установить некоторые значения по умолчанию.
: ${JAVA_HOME:=/usr/local/jdk-1.6.0_28}
Затем можно 'установить его и забыть его' (пока значение по умолчанию jvm изменения).