если синтаксическая ошибка оператора - PullRequest
1 голос
/ 24 июня 2011
if [ (`grep -R -l "${images}" *` | wc -l) == 1 ]

Это не работает. Если я сделаю это в командной строке, то это даст мне номер.

grep -R -l "${images}" * | wc -l

Я хочу посмотреть, если это число 1. Если это что-то сделать. Если не делать что-то еще. Почему первый кусок кода дает мне синтаксическую ошибку?

Я обновил свой код. image_count верен с числом, но по какой-то причине он всегда делает другое, даже если $ image_count действительно равен 1. Так что мое утверждение if неверно. Кто-нибудь знает почему?

image_count=`grep -R -l "${images}" * | wc -l`
echo $image_count
if [ $image_count == 1 ]; then
new_name=`grep -R -l "slide[0-9]"`
echo new_name
else
echo "non 1"
fi

Ответы [ 5 ]

1 голос
/ 24 июня 2011

Так что мое утверждение if неверно. Кто-нибудь знаешь почему?

Ну, это тестовое утверждение (в пределах [ ]), которое кажется неправильным. Это своего рода смешение двух языков: командного языка bash (которые представляют собой команды, исполняемые файлы по конвейеру + синтаксис потока управления).

OTOH, в [] выше, это язык выражений программы test, см. Справочную страницу: $ man test : "(EXPRESSION)".

Выражение: не , а произвольная команда оболочки, но что-то созданное из примитивов (строк, чисел и т. Д.) И операторов (-eq, -oe).

Одним из мостов между этими двумя языками, конечно же, является backtick, который запускает в нем команду bash и заменяет вывод на строку , с которой test затем может работать.

Итак, как кратко ответили другие, просто выдвиньте галочки на границу левой стороны, то есть из:

if [ (`grep -R -l "${images}" *` | wc -l) == 1 ]

до

if [ `grep -R -l "${images}" * | wc -l` = 1 ]

ОБНОВЛЕНИЕ: глядя на вашу вторую версию, другая проблема заключается в том, что == не является допустимым оператором в test (снова, см. Man-страницу). Вместо этого используйте обычный =.

С другой стороны, == поддерживается самим bash (в достаточно недавних версиях) - немного сбивает с толку ..

0 голосов
/ 09 октября 2011

Вы можете избежать сложного использования канала и использовать опцию -c команды grep для вывода количества совпадающих строк.

if [ $( grep -rlc "${images}" * ) -eq 1 ]; then

Несколько вещей здесь, используя '-c' и сравнивая с числом 1, против строки 1. (-R и -r эквивалентны в руководстве grep)

0 голосов
/ 24 июня 2011
foo=`grep -R -l "${images"} * | wc -l`
if [ $? -ne 0 ]; then
    if [ $foo == 1 ]; then
        echo "1 file found";
    else
        echo "$foo files found";
    fi
else 
    echo "no files found";
fi
0 голосов
/ 24 июня 2011

1001 * попробовать *

#!/bin/bash
if [ `grep -R -l "${images}" * | wc -l` == "1" ]; then
  echo "hazzar!"
fi
0 голосов
/ 24 июня 2011

использование:

if [ `grep -R -l "${images}" * | wc -l` == 1 ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...