Хотя цикл никогда не заканчивается - PullRequest
4 голосов
/ 24 февраля 2010

Я работаю с Bash и пытаюсь сделать что-то вроде этого:

A=1
while [ $A=1 ]; do
    read line
    echo $line | grep test >/dev/null   
    A=$?
    echo $A
done 

Этот сценарий никогда не заканчивается, даже когда grep завершается успешно, и A устанавливается в 0. Что я здесь пропускаю? Ниже приведен пример вывода.

$ ./test.sh

ASDF

1

тест

0

гм ...

1

Ответы [ 7 ]

8 голосов
/ 24 февраля 2010

Вам необходимо использовать правильный оператор сравнения. Bash имеет различные операторы для сравнения целых чисел и строк.

Кроме того, в выражении сравнения необходим правильный интервал.

Вам нужно

while [ $A -eq 1 ]; do

См. здесь , чтобы узнать больше

5 голосов
/ 24 февраля 2010

Я нахожу синтаксис Bash довольно ужасным - вы пробовали что-то вроде:

while [$ A -eq 1] ...?

Возможно, вы пытаетесь переназначить 1 на $ A или что-то странное в этом роде.

4 голосов
/ 24 февраля 2010

Попробуйте:

while [ $A -eq 1 ]; do
3 голосов
/ 25 февраля 2010

Большинство ответов были сосредоточены на целочисленных / строковых и пробелах, что хорошо, но ваш код выглядит настолько однотипным, что IMO должен быть полностью переработан. Допустим, идея состоит в том, чтобы обрабатывать строки, пока одна строка не будет соответствовать регулярному выражению 'test':

while read line; do      
  if [[ "$line" =~ test ]] && break
  # do something with $line
done

Конечно, это можно еще больше упростить, если вы воспользуетесь такими инструментами обработки текста, как sed:

sed -e '/test/,$d'
1 голос
/ 24 февраля 2010

вы можете сделать это вместо этого.Не нужно вызывать внешний grep.

while true; do
    read line
    case "$line" in
      *test* ) break;;
    esac
done 
echo $line
0 голосов
/ 24 февраля 2010

Все ваши ответы содержатся в Расширенном руководстве по написанию сценариев Bash . Это потрясающе.

0 голосов
/ 24 февраля 2010

Вы не пробовали это

while [ $A == "1" ]
   ....
done

Редактировать: К сожалению с Дан упомянул мою ошибку, я любезно признаю свою ошибку и отредактировал ее соответственно - Спасибо Дан для головы ...

while [ $A -eq 1 ]
   ....
done

Извини! :( Надеюсь это поможет, С наилучшими пожеланиями, Том.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...