пару вещей:
- Вам нужны пробелы около
[
и ]
.
- Возможно, вы не хотите использовать
[
и ]
.
Оператор 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 этого оператора.
Вам нужно добавить пробел после if. –
Да. Просто борюсь с вариантами редактирования ;-) Все еще не уверен, как отформатировать последнюю строку, похожую на первую строку моего ответа: D –
+1 для вашего приятного использования grep :). –