Я ищу строку в кавычках, где слово Linux встречается где-то между круглыми скобками, которые находятся где-то внутри кавычек. Для этого я должен использовать регулярное выражение. Я должен сделать это в ОС Linux (используя Virtual Box Terminal). Я использовал следующее регулярное выражение:
Но проблема в том, что я получаю
каждый раз. В чем проблема? Я пробовал это регулярное выражение в « Ссылка », он отлично работает, нет ничего плохого в регулярном выражении. Но оболочка Linux всегда создает ту же проблему . Я использовал «» перед круглыми скобками, потому что они метасимволы. То же самое я делал перед двойными кавычками . Но это не работает. Может ли кто-нибудь помочь мне, пожалуйста?
Я набрал код так же, как Командная строка Linux: полное введение
, стр. 369
но подскажите ошибку:
line 7 `if[ -e "$FILE" ]; then` код выглядит следующим образом:
#!/bin/bash
#test file exists
FILE="1"
if[ -e "$FILE" ]; then if[ -f "$FILE" ]; then echo :"$FILE is a regular file" fi if[ -d "$FILE" ]; then echo "$FILE is a directory" fi
else echo "$FILE does not exit" exit 1
fi exit Я хочу понять, что привело к ошибке? Как я могу изменить код? Моя система — Ubuntu.
Ответ 1
#!/bin/bash
#test file exists
FILE="1"
if [ -e "$FILE" ]; then if [ -f "$FILE" ]; then echo :"$FILE is a regular file" fi
... Эти (и их комбинации) тоже были бы неверными:
if [-e "$FILE" ]; then
if [ -e"$FILE" ]; then
if [ -e "$FILE"]; then С другой стороны, все в порядке:
if [ -e "$FILE" ];then # no spaces around ;
if [ -e "$FILE" ] ; then # 1 or more spaces are ok Btw они эквивалентны:
if [ -e "$FILE" ]; then
if test -e "$FILE"; then Они также эквивалентны:
if [ -e "$FILE" ]; then echo exists; fi
[ -e "$FILE" ] && echo exists
test -e "$FILE" && echo exists И средняя часть вашего script была бы лучше с elif
следующим образом:
if [ -f "$FILE" ]; then echo $FILE is a regular file
elif [ -d "$FILE" ]; then echo $FILE is a directory
fi 1 ответ 1
результатом wc -w будет числовое значение, оно не может быть сравнено указанным вами способом = с строковым значением null . В вашем случае нужно использовать, конструкцию -eq 0 . К тому-же вы в условии ставите 2-е константы, тоесть выражение
Для того, чтобы это выражение выдало результат, используйте
В общем итоге ваше условие, как я его понял, должно выглядеть следующим образом:
Более того, мне кажется целесообразние, в вашем случае, использовать условие:
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
Выход и сохранение
CTRL + X , затем Y и Enter
Установить script исполняемый файл и запустить
Может помочь кому-то еще: у меня возникли такие же проблемы, когда я сделал некоторую «копию-вставку» из документа Microsoft Word, где я сделал заметки, в свою оболочку script (s).
Повторная запись вручную, тот же самый код в script просто решил это.
Сначала это было совершенно непонятно, я думаю, что скрытые символы Word и/или форматирование были проблемой. Очевидный, но не видимый. Я потерял около часа на этом (я не эксперт в оболочке, как вы могли догадаться. )
Иногда эта ошибка возникает из-за непредвиденных символов CR в файле, обычно потому, что файл был сгенерирован в системе Windows, которая использует окончания строки CR. Вы можете исправить это, запустив os2unix или tr , например:
Это удаляет из файла любые символы CR.
Отредактируйте свой код в любой среде Linux, тогда вы не столкнетесь с этой проблемой. Если редактировать в окнах блокнот в любом пространстве возьмет его как ^ М.
У меня точно такая же проблема, как и выше, и я провел целый день, чтобы понять, что мне не нравится мой подход к новой линии. Вместо этого я использовал один и тот же код с подходом с двоеточием. Например, мой исходный код с использованием новой строки (которая забросила ту же ошибку, что и ваша):
И используя код с точкой с запятой с работающим чудом:
Я замечаю, что такая же проблема возникает и для других команд, используя подход новой строки, поэтому я думаю, что буду придерживаться точки с запятой для моего будущего кода.
Там вы можете получить эту проблему, не имея смешанных проблем с новой строкой (по крайней мере, в моей оболочке, которая является GNU bash v4.3.30):
Это связано с тем, что bash расширяет обратные выходы внутри строк с двойными кавычками (см. руководство bash на quoting и подстановка команд), и перед поиском соответствующего обратного хода будут интерпретировать любые дополнительные двойные кавычки как часть подстановки команды:
Вы можете обойти это, избегая обратных шагов в вашей строке с помощью обратного слэша или используя строку с одним кавычком.
Я не уверен, почему это дает только одно сообщение об ошибке, но я думаю, что это связано с определением функции:
./check.sh:
строка 10: синтаксическая ошибка рядом с неожиданным маркером «done» ./check.sh: строка 10: `done’

