2

У меня есть следующий скрипт bash:

while [ $loop == "true" ]
   do
     //do stuff
   done

но это говорит об ошибке в [.

Также это работает как демон, когда аргумент stop передается в скрипт ... цикл должен. Я предполагаю, что установка $ loop в false автоматически завершит цикл.

2 ответа2

5

М. Васкес-Абрамс совершенно прав. Это не имеет ничего общего с кавычками, превращающими вещи, которые уже являются строками, в строки, или с какой-то ошибочной идеей, что = во встроенной команде bash [ это что-то кроме сравнения строк. (Читайте § 6.4 Руководства пользователя Bash, люди!) Это все, что связано с тем, что происходит с пустыми полями после того, как расщепление полей превращает слова в поля.

Если переменная loop shell пуста или равна нулю, то $loop расширяется до пустого поля. После разделения поля пустые поля отбрасываются. Обратите внимание, что разделение полей и проверка пустых полей предшествуют удалению кавычек. Таким образом, "$loop" расширяется до поля "" , которое не является пустым и, следовательно, не удаляется. После удаления кавычки это пустое поле, которое становится пустым аргументом команды.

Команда [ требует, чтобы у оператора = было два операнда, вперед и назад. Все остальное является синтаксической ошибкой. Поскольку пустое поле удаляется, последовательность слов

[ $loop = true ]
расширяется до четырех полей
  1. [
  2. =
  3. true
  4. ]

когда команде [ нужно пять синтаксически правильных команд:

  1. [
  2.  
  3. =
  4. true
  5. ]

Конечно, пустая строка не равна четырехзначной строке true , а состояние выхода команды не равно нулю.

Опять же, все это есть в Руководстве пользователя Bash, в §3.5 и §3.5.7. Руководство - твой друг.

1

Лучший способ напечатать это было бы:

while [ "$loop" = "true" ]

Прочитайте раздел «Разработка команды test» по следующему URL:
http://wiki.bash-hackers.org/syntax/quoting

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .