Какие методы регулярного выражения проверить вход могли использоваться в сценариях оболочки?

Прежде всего, с таким конкретным требованием, необходимо знать, что были исправлены любые ядра, которые Вы захватываете от Debian. Они не нетронутые восходящие источники.

Тем не менее Debian стабильное использование 2.6.32.x и хрипящий, я верю, будет использовать 3.2.x. Так 2.6.34.x, вероятно, никогда не упаковывался командой ядра Debian. Проверка Linux snapshot.debian.org, 2,6 страницы показывают, что 2.6.34 был вставлен экспериментальным, но это, кажется, 2.6.34 без.8. И конечно, это содержит патчи Debian.

Я думаю 2.6.34, имеет, делают deb-pkg, таким образом, должно быть довольно легко встроить восходящий источник в a .deb, и затем установите это. Ваша другая опция состояла бы в том, чтобы захватить источники Debian от более старых 2.6.34.0 и слияние в.8 самостоятельно. Это приведет к.8 с патчами Debian и является, вероятно, немного большим количеством работы.

BTW: Если Вы собираетесь работать 2.6.34.x, необходимо работать 2.6.34.14 (текущий выпуск на том ответвлении).

5
05.07.2014, 14:15
3 ответа

Ошибка мне кажется очевидной, переменная «I» - это строка в виде петли для , итераций по величине диктографии / отображения клиента. Это значение - это самим диктором / сопоставлением, и итерациями, по его мнению, приведет вас к успеху списка ключей (т. Е. «Свойства»].

cat Customer.json |  python -c 'import sys; import simplejson as json; \
print "\n".join( [i for i in json.loads( sys.stdin.read() )["customer"]["properties"] ] )'

даст вам

 customerid
 name

и следующее должно быть ближе к вашей цели:

cat Customer.json |  python -c 'import sys; import simplejson as json; \
print "\n".join( ["{} {}".format(k, v) for k,v in json.loads( sys.stdin.read() )["customer"]["properties"].iteritems() ] )'

, который дает:

customerId {'index': 'not_analyzed', 'type': 'string'}
name {'index': 'not_analyzed', 'type': 'string'}

оттуда, я бы порекомендовал, чтобы вы сделали Python в сценарии. Вам придется принять решение о том, как получить из строки на строку и сделать Дополнительное форматирование. Multiliner всегда более прост в отладке (если ваш вопрос доказан вашим вопросом) и поддерживается и дает более значимые (строки) сообщений об ошибках.

-121--217894-

Стандарт тест команда также известна как [, не имеет оператора = ~ . Большинство оболочек имеют эту команду встроенной в наше время.

Оболочка Korn представила конструкцию [[...]] [[[...]] [ [[ [[[[[[ [[[[[[ команда) с альтернативным синтаксисом и различными правилами разбора.

ZSH и Bash скопировали, что в некоторой степени с ограничениями и множеством различий, но это никогда не было стандартизировано, поэтому не следует использовать в портативных скриптах SH .

KSH93 Всегда имел способ преобразовать расширенное регулярное воздействие на его глобусы с:

printf '%P\n' "regexp"

, и вы могли бы сделать:

[[ $var = pattern ]]

позже (некоторое время в период с 2001 по 2003 год) он также включил регулярные выражения в своих шариках Как с синтаксисом ~ (E) Regex ~ (E) для расширенных регулярных выражений, чтобы вы могли сделать:

[[ $var = ~(E)pattern ]]

такого рода сопоставление картины работает только с [[...]] Конструкция или чехол , а не команду [.

ZSH Добавлена ​​оператор сопоставления RegexP для как его [[[, и [[[...]] [[ в первую очередь в 2001 году с модулем PCRE Отказ Синтаксис был изначально [string -pcre-Match Regex] или [[String -Pcre-Match Regex]] .

Bash Добавлена ​​оператор = ~ в Bash 3.0 (в 2004 году). Используя расширенные регулярные выражения. Это было добавлено вскоре после KSH93 и ZSH (снова с различиями).

ksh93 и Bash-3.1 и выше использования цитаты в Escape Оператор Regexp, вызывающий всевозможные путаницы и значения, нельзя использовать с [ Команда там. ZSH не имеет этой проблемы (цитаты используются для котировки оболочки, а обратную косулью, чтобы избежать оператора Regex как обычно), так что = ~ работает в ZSH [ Команда (хотя сама нуждается в цитировании с = Foo - это оператор глобубинга в ZSH ).

YASH (небольшая скорлудка POSIX) не имеет [[[...]] [, но его [[[ команда имеет = ~ Оператор (с использованием ERES) и работает так, как вы ожидаете (вроде ZSH .

В любом случае, ни один [[[...]] , ни = ~ не являются POSIX и должны использоваться в скриптах SH . Стандартная команда для выполнения регулярных выражений, сопоставив на строки EXPR :

if expr "x$var" : "x$regex" > /dev/null; then...

Обратите внимание, что EXPR REGEXPS прилагается в начале, и вам нужно, чтобы x Чтобы избежать проблем с $ VAR значениями EXPR операторы.

Однако в большинстве случаев вам не нужно регулярное значение, так как простое сопоставление шаблона оболочки достаточно для большинства случаев:

case $var in
  (pattern) echo matches
esac
8
27.01.2020, 20:31

Измените #!/bin/sh на #!/bin/bash и вместо этого используйте двойные скобки:

if [[ $1 =~ $re ]]; then

Это команда расширенного теста, в отличие от (обычной) команды теста. =~ может использоваться только с версией [[ ... ]] и требует Bash 3.0 или более поздней версии.

6
27.01.2020, 20:31

Если добавить маршрут дважды, а затем проверить его с помощью команды route , то будет отображаться только одна запись. То есть во второй раз, когда вы его пробежали, ничего не добавилось. Аналогично, после удаления маршрута его нельзя удалить снова.

Если сообщение об ошибке не нравится, измените сценарий таким образом, чтобы он сначала запустил route и проверил результаты (с помощью grep ), чтобы убедиться, что маршрут уже настроен.

В качестве альтернативы (и менее элегантной) можно перенаправить stderr команды route add/del на /dev/null , чтобы они не отображались.

-121--230722-

Мне кажется, что ошибка ясна: переменная "i" является строкой, так как цикл для итерирует значение "customer" dict/mapping. Это значение само по себе является dict/mapping и итерация над ним даст вам последовательность списка ключей (т.е. ["свойства"].

cat Customer.json |  python -c 'import sys; import simplejson as json; \
print "\n".join( [i for i in json.loads( sys.stdin.read() )["customer"]["properties"] ] )'

даст вам

 customerid
 name

и следующее должно приблизить вас к вашей цели:

cat Customer.json |  python -c 'import sys; import simplejson as json; \
print "\n".join( ["{} {}".format(k, v) for k,v in json.loads( sys.stdin.read() )["customer"]["properties"].iteritems() ] )'

что дает:

customerId {'index': 'not_analyzed', 'type': 'string'}
name {'index': 'not_analyzed', 'type': 'string'}

Оттуда я бы рекомендовал вам на самом деле сделать питона в сценарии. Необходимо решить, как получить строку - строку и выполнить дополнительное форматирование. Мультилинер всегда более прост в отладке (случай доказан вашим вопросом) и ремонтопригоден, а также дает более значимые (номера строк) сообщения об ошибках.

-121--217894-

В bash старый тест [ не поддерживает regex. Вместо этого необходимо использовать новый тест [:

re="\/$"

if [[ $1 =~ $re ]]; then
        echo "${ATTENTION_PREFIX}$1 DIRECTORY MAY NOT CONTAIN A \"/\" OR LITERAL SLASH!${ATTENTION_POSTFIX}"
        exit 1
fi

Здесь можно просмотреть дополнительные .

Также необходимо изменить строку # !/bin/sh shebang на # !/bin/bash .

5
27.01.2020, 20:31

Теги

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