2013-10-07 3 views

ответ

3

Вы должны добавить пробелы между вашим [], попробуйте следующее:

if [ $(grep -o BPR $file | wc -l) == 1 ]; then 
3

Вам нужно пространство вокруг вашего состояния:

if [ $(grep -o BPR $file | wc -l) == 1 ]; then 
    ^        ^

1) Если вы используя bash, вы можете использовать встроенную команду [[ ..]] вместо test ([ ...]).

2) Вы также можете избежать wc, используя -c вариант grep.

if [[ $(grep -c -o BPR $file) == 1 ]]; then 
+0

Вам нужно добавить пробел после if. –

+0

Да. Просто борюсь с вариантами редактирования ;-) Все еще не уверен, как отформатировать последнюю строку, похожую на первую строку моего ответа: D –

+0

+1 для вашего приятного использования grep :). –

1

Помимо ваших ошибок синтаксиса, вам не нужно wc либо, если вы не все равно, что там может быть несколько occurrances из BPR в файле:

if grep -o BPR "$file"; then 
+1

Вам не нужно wc в любом случае: 'grep -c -o BPR' –

+0

Я полагался на код выхода, чтобы различать« без совпадений »и« по крайней мере одно совпадение ». С помощью '-c' вам все равно нужно будет фиксировать значение и проводить сравнение, если существует допустимое различие между, скажем, 1 совпадением и 2. – chepner

0

, если вам нужно только знать, если строка соответствует не показывая фактический матч использовать

if grep -q 'anystring' file ; then 
1

пару вещей:

  • Вам нужны пробелы около [ и ].
  • Возможно, вы не хотите использовать [ и ].

Оператор if выполняет команду, которую вы ей даете. Если команда возвращает ноль, выполняется команда then инструкции if. Если команда возвращает ненулевое значение, выполняется часть else (если она существует).

Попробуйте это:

$ if ls some.file.name.that.does.not.exist 
> then 
>  echo "Hey, the file exists!" 
> else 
>  echo "Nope. File isn't there" 
> fi 

Вы получите выход:

ls: some.file.name.that.does.not.exist: No such file or directory 
Nope. File isn't there 

Это первое заявление, конечно, выход из вашей команды ls. Второй - вывод из инструкции if. ls побежал, но не смог получить доступ к этому файлу (его не существует) и вернул e 1. Это вызвало предложение else.

Попробуйте это:

$ touch foo 
$ if ls foo 
>  echo "Hey, the file exists!" 
> else 
>  echo "Nope. File isn't there" 
> fi 

Вы получите выход:

foo 
Hey, the file exists! 

Снова первая линия, на выходе из ls. Поскольку файл существует и является статистическим, ls вернул 0.Это вызвало предложение if выполнить печать второй строки.

Что делать, если я хочу test, существует ли файл?

Вы можете использовать test команду:

$ if test -e foo 
> then 
>  echo "Hey, the file exists!" 
> else 
>  echo "Nope. File isn't there" 
> fi 

Если файл foo существует, то команда тест возвращает 0. Это означает, что echo "Hey, the file exists!" будет выполнять. Если файл не существует, тест вернет 1, и будет выполнено предложение else.

Теперь это сделать:

$ ls -il /bin/test /bin/[ 
10958 -rwxr-xr-x 2 root wheel 18576 May 28 22:27 /bin/[ 
10958 -rwxr-xr-x 2 root wheel 18576 May 28 22:27 /bin/test 

Это первое число является inode. Если два совпадающих файла имеют один и тот же индекс, они жестко связаны друг с другом. [ ... ] - это просто другое имя для команды test. Фактическая команда [. Вот почему вам нужны пробелы. Вы также видите, что if проверяет, успешно ли выполняется команда, и на самом деле не выполняет логическую проверку (исключение - если вы используете двойные квадратные скобки, такие как [[ и ]] вместо [ и ]. Они встроены в оболочку, а не как . встроенные команды)

То, что вы, вероятно, хотите сделать это:

if grep -q "BPR" "$file" 
then 
    echo "'BPR' is in '$file'" 
fi 

флаг -q говорит grep, чтобы закрыть его лай. Команда grep вернет 0, если шаблон, который вы указали, находится в файле, а ненулевое (точное значение не имеет значения - если оно не равно 0), если оно не может.

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

Смежные вопросы