Я пытался искать подобные проблемы, но не могу найти ту, которая имеет смысл для моего кода. Я только что запустил приблизительно 2 недели назад, так, чтобы могла просто быть неспособность понять мигрирующие ответы для одного случая другому.
У меня есть код, чтобы искать все каталоги в файле и искать каждый файл вход слова, затем в конечном счете поместить любой из файлов с непустыми выводами в файл.
Я использовал grep строку:
g=$(grep -ni "$word" $myfile)
if [ ! -z $g ]; then
echo "the file inside is: $myfile"
fi
Я могу поднять полный код, но это - ошибка:
/home/anthony/myscripts/wordturbo3.sh: line 22: [: 17:chemistry: binary operator expected
(для word=chemistry, program=wordturbo3.sh)
Эта ошибка только заполняет после того, как я буду использовать команду grep с ! -z
спецификаторы. Ответы к заданиям, которые я имею, пишут это немного по-другому: это использует если еще команда (if -z, else
) вместо (! -z
) для просто, если часть (не еще). Это, кажется, требует что мой если условие, -z
, имейте вывод для функционирования (такие как эхо "этот файл, пусто").
Однако я просматриваю намного больше файлов, чем пример и хотел бы не должным быть повторить "этот файл, пустые" сотни времен именно так, что я "еще" могу выполнить часть команды. Поэтому я просто пытался обойти эту потребность при помощи (! -z
) для просто, если часть.
Это выполняет то, что я хочу, но это сначала выкладывает приблизительно 17 строк "ожидаемого бинарного оператора".
Существует ли простое обходное решение к этому?
Заранее спасибо за совет.
править: о, и я нашел, что предложение онлайн использовало -n
вместо -z
для указывают, "содержит информацию" вместо того, чтобы "опустеть", но это, казалось, не работало. Программа не работала, когда я заменил (! -z
) с (-n
).
Вероятно, проблема то, что Ваш grep
возвраты несколько соответствий и неупомянутое $g
внутри [ ! -z $g ]
подвергается разделению слова.
Напр. данный
$ cat myfile
foo
bar
Foo
Bar
затем
$ g=$(grep -ni foo myfile)
$ echo $g
1:foo 3:Foo
так
$ [ ! -z $g ]
bash: [: 1:foo: binary operator expected
Сообщение об ошибке то, потому что -z
унарный оператор, т.е. он ожидает отдельный аргумент; так как Вы дали два аргумента [
... ]
это ожидает, что Вы будете использовать бинарного оператора (как -eq
).
Если Вы заключаете переменное расширение в кавычки т.е. "$g"
, все соответствия, возвращенные grep
будет рассматриваться как отдельный аргумент, таким образом, -z
унарный тест будет работать:
$ [ ! -z "$g" ] && echo "non empty"
non empty
Однако Вы не нуждаетесь ни в одном из этого - вместо этого, просто проверяете статус выхода самого grep:
$ if grep -qi foo myfile; then echo "foo is in myfile"; fi
foo is in myfile
Я понял это. Я должен был измениться:
if [ ! -z $g ]; then
кому:
if [ ! -z "$g" ]; then
Однако я не вполне понимаю почему все же. Я буду продолжать считать сеть, но если бы у кого-либо есть какие-либо мысли, я ценил бы ее.
Спасибо!