Меню Закрыть

Bash синтаксическая ошибка рядом с неожиданным маркером

Я ищу строку в кавычках, где слово Linux встречается где-то между круглыми скобками, которые находятся где-то внутри кавычек. Для этого я должен использовать регулярное выражение. Я должен сделать это в ОС Linux (используя Virtual Box Terminal). Я использовал следующее регулярное выражение:

Но проблема в том, что я получаю

каждый раз. В чем проблема? Я пробовал это регулярное выражение в « Ссылка », он отлично работает, нет ничего плохого в регулярном выражении. Но оболочка Linux всегда создает ту же проблему . Я использовал «» перед круглыми скобками, потому что они метасимволы. То же самое я делал перед двойными кавычками . Но это не работает. Может ли кто-нибудь помочь мне, пожалуйста?

2 ответа

Проблема заключается в невыпадающих двойных кавычках внутри выражения, например, вокруг этой части "]*)?(([^]" . Если вы хотите передать литерал " , включая внутренние двойные кавычки или () или [] , тогда вы должны процитировать цитаты! Вы могли бы сделать

Но менее уродливым способом является цитировать все выражение с помощью одинарных кавычек , и в целом всегда сильная (одиночная) цитата вашего регулярного выражения, поэтому оболочка не делает ничего странного для нее, прежде чем она будет передана как аргумент egrep или любой другой программы, которую вы используете:

(теперь вам также не нужно избегать двойных кавычек снаружи, но вам нужны другие обратные косые черты, чтобы сделать круглые скобки буквальными (в ERE))

, если вам не нужна остальная часть строки, добавьте -o (только для соответствия)

Ты не привел пример, поэтому я сделал глупую . вот что:

(NB: используя GNU grep , вы можете сделать grep -E вместо egrep )

Любая идея о том, что может быть проблемой?

Читайте также:  Японское кино лучшие фильмы про самураев

Сохранено как .sh и запущено bash file.sh

CentOS 6 32-разрядный

В чем проблема? В первый раз, когда используется BASH, нужно что-то для простого бесконечного цикла на что-то.

Запустите cat -v file.sh .

Скорее всего, у вас есть возврат каретки или свободное место в вашем файле. cat -v покажет их как ^M и M-BM- или M- соответственно. Он также будет показывать любые другие странные символы, которые вы, возможно, попали в ваш файл.

Удалите разрывы строк Windows с помощью

Я получал ту же ошибку на Cygwin; Я сделал следующее (один из них исправил его):

  • Преобразован TABS в SPACES
  • выполнил dos2unix в файле .(ba)sh

Какая ошибка вы получаете?

Если вы получите эту ошибку, у вас могут быть неудачные окончания строк. Unix использует в конце файла, а Windows использует . Этот символ интерпретируется как символ.

Вы можете использовать od -a test.sh для просмотра невидимых символов в файле.

sp обозначает пробел, ht обозначает вкладку, cr обозначает , а nl обозначает . Обратите внимание, что все строки заканчиваются на cr , за которым следует символ nl .

Вы также можете использовать cat -v test.sh , если ваша команда cat принимает параметр -v .

Если у вас есть dos2unix на вашем поле, вы можете использовать эту команду для исправления вашего файла:

Открыть новый файл с именем foobar

Вход script

Выход и сохранение

CTRL + X , затем Y и Enter

Установить script исполняемый файл и запустить

Может помочь кому-то еще: у меня возникли такие же проблемы, когда я сделал некоторую "копию-вставку" из документа Microsoft Word, где я сделал заметки, в свою оболочку script (s).

Повторная запись вручную, тот же самый код в script просто решил это.

Читайте также:  Javascript работа с json

Сначала это было совершенно непонятно, я думаю, что скрытые символы Word и/или форматирование были проблемой. Очевидный, но не видимый. Я потерял около часа на этом (я не эксперт в оболочке, как вы могли догадаться. )

Иногда эта ошибка возникает из-за непредвиденных символов CR в файле, обычно потому, что файл был сгенерирован в системе Windows, которая использует окончания строки CR. Вы можете исправить это, запустив os2unix или tr , например:

Это удаляет из файла любые символы CR.

Отредактируйте свой код в любой среде Linux, тогда вы не столкнетесь с этой проблемой. Если редактировать в окнах блокнот в любом пространстве возьмет его как ^ М.

У меня точно такая же проблема, как и выше, и я провел целый день, чтобы понять, что мне не нравится мой подход к новой линии. Вместо этого я использовал один и тот же код с подходом с двоеточием. Например, мой исходный код с использованием новой строки (которая забросила ту же ошибку, что и ваша):

И используя код с точкой с запятой с работающим чудом:

Я замечаю, что такая же проблема возникает и для других команд, используя подход новой строки, поэтому я думаю, что буду придерживаться точки с запятой для моего будущего кода.

Там вы можете получить эту проблему, не имея смешанных проблем с новой строкой (по крайней мере, в моей оболочке, которая является GNU bash v4.3.30):

Это связано с тем, что bash расширяет обратные выходы внутри строк с двойными кавычками (см. руководство bash на quoting и подстановка команд), и перед поиском соответствующего обратного хода будут интерпретировать любые дополнительные двойные кавычки как часть подстановки команды:

Читайте также:  Формула максимальной скорости маятника

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

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

./check.sh: строка 10: синтаксическая ошибка рядом с неожиданным маркером «done» ./check.sh: строка 10: `done’

1 ответ 1

результатом wc -w будет числовое значение, оно не может быть сравнено указанным вами способом = с строковым значением null . В вашем случае нужно использовать, конструкцию -eq 0 . К тому-же вы в условии ставите 2-е константы, тоесть выражение

"pidof python2 run.py | wc -w" так и останется строкой

pidof python2 run.py | wc -w .

Для того, чтобы это выражение выдало результат, используйте

$(pidof python2 run.py | wc -w) .

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

if [ "$(pidof python2 run.py | wc -w)" -eq 0 ]; then

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

Рекомендуем к прочтению

Добавить комментарий

Ваш адрес email не будет опубликован.