Шаблоны сценария оболочки [закрываются]

Используйте PDO и подготовленные запросы.

($conn - объект PDO)

$stmt = $conn->prepare("INSERT INTO tbl VALUES(:id, :name)");
$stmt->bindValue(':id', $id);
$stmt->bindValue(':name', $name);
$stmt->execute();
23
задан Jonathan Leffler 1 September 2018 в 07:25
поделиться

3 ответа

Я расширил бы ответ нормандца на 6 строк, и последним из тех является пробел:

#!/bin/ksh
#
# @(#)$Id$
#
# Purpose
 

Третья строка является идентификационной строкой управления версиями - это - на самом деле гибрид с маркером SCCS'@(#)'это может быть определено программой (SCCS) what и строка версии RCS, которая расширена, когда файл подвергается RCS, VCS по умолчанию, я использую для своего личного пользования. Программа RCS ident берет расширенную форму $Id$, который мог бы быть похожим $Id: mkscript.sh,v 2.3 2005/05/20 21:06:35 jleffler Exp $. Пятая строка напоминает мне, что сценарий должен иметь описание своей цели наверху; я заменяю слово фактическим описанием сценария (который является, почему нет никакого двоеточия после него, например).

После этого нет по существу ничего стандартного для сценария оболочки. Существуют стандартные фрагменты, которые появляются, но никакой стандартный фрагмент, который появляется в каждом сценарии. (Мое обсуждение предполагает, что сценарии записаны в Границе, Korn или POSIX (Bash) нотации оболочки. Существует целое отдельное обсуждение почему любой помещающий производную Оболочки C после #! символ живет в грехе.)

Например, этот код появляется в некоторой форме или форме каждый раз, когда сценарий создает промежуточные (временные) файлы:

tmp=${TMPDIR:-/tmp}/prog.$$
trap "rm -f $tmp.?; exit 1" 0 1 2 3 13 15

...real work that creates temp files $tmp.1, $tmp.2, ...

rm -f $tmp.?
trap 0
exit 0

Первая строка выбирает временный каталог, принимая значение по умолчанию к/tmp, если пользователь не указывал альтернативу ($TMPDIR очень широко распознан и стандартизирован POSIX). Это затем создает префикс имени файла включая идентификатор процесса. Это не меры безопасности; это - простая мера по параллелизму, препятствуя тому, чтобы несколько экземпляров сценария топтали данные друг друга. (Для безопасности используйте непредсказуемые имена файлов в непубличном каталоге.) Вторая строка гарантирует что'rm'и'exit'команды выполняются, если оболочка получает какой-либо из сигналов SIGHUP (1), SIGINT (2), SIGQUIT (3), SIGPIPE (13) или SIGTERM (15).'rm'команда удаляет любые промежуточные файлы, которые соответствуют шаблону; exit команда гарантирует, что состояние является ненулевым, указывая на своего рода ошибку.'trap'0 средств, что код также выполнен, если оболочка выходит по какой-либо причине - она покрывает небрежность в разделе, отмеченном 'реальная работа'. Код в конце затем удаляет любые выживающие временные файлы, прежде, чем снять прерывание на выходе, и наконец выходит с нулем (успех) из состояния. Очевидно, если Вы хотите выйти с другим состоянием, Вы можете - просто удостоверяться, что Вы устанавливаете его в переменной прежде, чем работать rm и trap строки, и затем используют exit $exitval.

Я обычно использую следующее для удаления пути и суффикса из сценария, таким образом, я могу использовать $arg0 при создании отчетов об ошибках:

arg0=$(basename $0 .sh)

Я часто использую функцию оболочки для создания отчетов об ошибках:

error()
{
    echo "$arg0: $*" 1>&2
    exit 1
}

Если существуют только один или возможно два ошибочных выхода, я не беспокоюсь функцией; если больше существует, я делаю, потому что это упрощает кодирование. Я также создаю более или менее тщательно продуманные вызванные функции usage дать сводку того, как использовать команду - снова, только если существует больше чем одно место, где это использовалось бы.

Другой довольно стандартный фрагмент является циклом парсинга опции, с помощью getopts встроенная оболочка:

vflag=0
out=
file=
Dflag=
while getopts hvVf:o:D: flag
do
    case "$flag" in
    (h) help; exit 0;;
    (V) echo "$arg0: version $Revision$ ($Date$)"; exit 0;;
    (v) vflag=1;;
    (f) file="$OPTARG";;
    (o) out="$OPTARG";;
    (D) Dflag="$Dflag $OPTARG";;
    (*) usage;;
    esac
done
shift $(expr $OPTIND - 1)

или:

shift $(($OPTIND - 1))

Кавычки вокруг "$OPTARG" обрабатывают пробелы в аргументах. Dflag кумулятивен, но нотация, используемая здесь, теряет след пробелов в аргументах. Существуют (нестандартные) способы работать вокруг той проблемы, также.

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

Один заключительный прием на данный момент - то, что у меня часто есть и GNU и версия не-GNU программ вокруг, и я хочу смочь выбрать, который я использую. Многие мои сценарии, поэтому, используют переменные, такие как:

: ${PERL:=perl}
: ${SED:=sed}

И затем, когда я должен вызвать Perl или sed, использование сценария $PERL или $SED. Это помогает мне, когда что-то ведет себя по-другому - я могу выбрать операционную версию - или при разработке сценария (я могу добавить дополнительные опции только для отладки к команде, не изменяя сценарий). (См. расширение параметра Shell для получения информации о ${VAR:=value} и связанные нотации.)

21
ответ дан 29 November 2019 в 01:04
поделиться

Любой код, который будет выпущенным в дикой природе, должен иметь следующий короткий заголовок:

# Script to turn lead into gold
# Copyright (C) 2009 Joe Q Hacker - All Rights Reserved
# Permission to copy and modify is granted under the foo license
# Last revised 1/1/2009

Хранение журнала изменений, входящего в заголовки кода, является возвратом от того, когда системы управления версиями были ужасно неудобны. Последняя измененная дата показывает кому-то, какого возраста сценарий.

, Если Вы собираетесь быть доверием bashisms, используйте #!/bin/bash, не/bin/sh, поскольку sh является вызовом POSIX любой оболочки. Даже если/bin/sh укажет на удар, много функций будут выключены при выполнении его через/bin/sh. Большинство дистрибутивов Linux не возьмет сценарии, которые полагаются на bashisms, пытаются быть портативными.

мне, комментарии в сценариях оболочки являются видом глупых, если они не читают что-то как:

# I am not crazy, this really is the only way to do this

сценарии Shell так просты, что (если Ваша запись демонстрации для обучения кого-то, как сделать это) код почти всегда устраняет себя.

Некоторым оболочкам не нравится питаться введенные 'локальные' переменные. Я полагаю по сей день, что Busybox (общая спасательная оболочка) является одним из них. Сделайте GLOBALS_OBVIOUS вместо этого, его намного более легкое для чтения, особенно при отладке через/bin/sh-x./script.sh.

Мое персональное предпочтение должно позволить логике выступить за себя и минимизировать работу для синтаксического анализатора. Например, многие люди могли бы записать:

if [ $i = 1 ]; then
    ... some code 
fi

, Где я был бы просто:

[ $i = 1 ] && {
    ... some code
}

Аналогично, кто-то мог бы записать:

if [ $i -ne 1 ]; then
   ... some code
fi

..., где я был бы:

[ $i = 1 ] || {
   ... some code 
}

единственное время я использую стандартный, если / тогда / еще то, если еще существует - если добавить соединение.

А ужасно безумный пример очень хорошего портативного кода оболочки может быть изучен, просто просмотрев 'настраивать' сценарий в большинстве пакетов бесплатного программного обеспечения то использование autoconf. Я говорю безумный, потому что его 6 300 строк кода, который угождает каждой системе, которая, как известно, укомплектовала, который имеет UNIX как оболочка. Вы не хотите такое чрезмерное увеличение размера, но интересно изучить некоторые различные взломы мобильности в.. такой как являющийся хорошим тем, кто мог бы указать на/bin/sh на zsh:)

Единственный другой совет, который я могу дать, является часами, Ваше расширение в здесь-документах, т.е.

cat << EOF > foo.sh
   printf "%s was here" "$name"
EOF

... собирается развернуть $name, когда Вы, вероятно, хотите оставить переменную на месте. Решите это через:

  printf "%s was here" "\$name"

, который оставит $name как переменную, вместо того, чтобы развернуть его.

я также настоятельно рекомендую изучение, как использовать прерывание для ловли сигналов.. и используйте те обработчики как шаблонный код. Сообщение под управлением сценария замедлиться с простым SIGUSR1 довольно удобно:)

самые новые программы, которые я пишу (которые являются инструментом / ориентированная командная строка) начинаются как сценарии оболочки, это - отличный способ моделировать инструменты UNIX.

Вам мог бы также понравиться компилятор сценария оболочки SHC, проверка это здесь .

7
ответ дан Tim Post 29 November 2019 в 01:04
поделиться

Я предложил бы

#!/bin/ksh

и вот именно. Тяжелый блок комментирует для сценариев оболочки? Я получаю willies.

Предложения:

  1. Документация должна быть данными или кодом, не комментариями. По крайней мере, usage() функция. Взгляните на как ksh и другой документ инструментов AST самостоятельно с - опции человека на каждой команде. (Не может связаться, потому что веб-сайт снижается.)

  2. Объявляют локальные переменные с typeset. Это - то, для чего это. Никакая потребность в противных подчеркиваниях.

3
ответ дан Norman Ramsey 29 November 2019 в 01:04
поделиться
Другие вопросы по тегам:

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