цикл bash while с командой как частью выражения? - PullRequest
1 голос
/ 05 апреля 2011

Я пытаюсь прочитать часть файла и остановить и конкретную строку, используя bash. Я не очень знаком с bash, но я читал руководство и различные ссылки, и я не понимаю, почему что-то вроде следующего не работает (но вместо этого выдает синтаксическую ошибку):

while { read -u 4 line } && (test "$line" != "$header_line")
do
  echo in loop, line=$line
done

Я думаю, что я мог бы написать цикл, который проверяет переменную "done", а затем выполнить мои реальные тесты внутри цикла и установить подходящее значение "done", но мне любопытно: 1) почему вышеописанное не работает, и 2) есть ли небольшая коррекция, которая бы работала? Я все еще не совсем понимаю, когда использовать [, (, {или ((), поэтому, возможно, сработает какая-то другая комбинация, хотя я пробовал несколько.

(Примечание. "Read -u 4 line" отлично работает, когда я вызываю его над циклом. Я открыл файл в файловом дескрипторе 4.)

Ответы [ 2 ]

5 голосов
/ 05 апреля 2011

Я думаю, что вы хотите, больше похоже на это:

while read -u 4 line && test "$line" != "$header_line"
do
    ...
done

Скобки (символы {}) используются для отделения переменных от других частей строки, когда пробел не может быть использован.Например, echo "${var}x" выведет значение переменной var, за которым следует x, но echo "$varx" выведет значение переменной varx.

Скобки (символы []) используются в качестве ярлыка для программы test.[ - это другое имя для test, но когда test обнаруживает, что он был вызван с [, ему требуется ] в качестве последнего аргумента.Дело в ясности.

Круглые скобки (символы ()) используются в ряде различных ситуаций.Обычно они запускают подоболочки, хотя и не всегда (я не совсем уверен в случае № 3 здесь):

  1. Получение одного кода выхода из серии процессов или одного потока вывода из последовательностикоманд.Например, (echo "Hi" ; echo "Bye") | sed -e "s/Hi/Hello/" напечатает две строки: «Привет» и «Пока».Это самый простой способ получить несколько операторов echo для создания одного потока.
  2. Оценка команд, как если бы они были переменными: $(expr 1 + 1) будет действовать как переменная, но будет выдавать значение 2.
  3. Выполнение математики: $((5 * 4 / 3 + 2 % 1)) будет оцениваться как переменная, но вычислит результат этого математического выражения.
2 голосов
/ 05 апреля 2011

Оператор && является оператором списка - он разделяет две команды и выполняется только тогда, когда первая имеет значение «истина», но в этом случае первая - это время, и он ожидает выполнения своих действий.И тогда он достигает делать, и в то время как материал уже история.Ваше намерение состоит в том, чтобы поместить это в выражение.Таким образом, вы положили его вместе с ().Например, это решение с небольшим изменением

while ( read -u 4 line  && test "$line" != "$header_line" )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...