бинарный оператор ожидал использовать!-z?

Я пытался искать подобные проблемы, но не могу найти ту, которая имеет смысл для моего кода. Я только что запустил приблизительно 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).

1
задан 17 April 2020 в 17:57

2 ответа

Вероятно, проблема то, что Ваш 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
1
ответ дан 25 April 2020 в 10:45

Я понял это. Я должен был измениться:

if [ ! -z $g ]; then

кому:

if [ ! -z "$g" ]; then

Однако я не вполне понимаю почему все же. Я буду продолжать считать сеть, но если бы у кого-либо есть какие-либо мысли, я ценил бы ее.

Спасибо!

0
ответ дан 25 April 2020 в 10:45

Другие вопросы по тегам:

Похожие вопросы: