Подтвердить что ты не робот

Перенаправление вывода bash для цикла

У меня есть простая команда BASH, которая выглядит как

for i in `seq 2`; do echo $i; done; > out.dat

Когда это выполняется, вывод seq 2 выводится на терминал и ничего не выводится в файл данных (out.dat)

Я ожидаю, что стандарт будет перенаправлен на out.dat, как будто он просто выполняет команду seq 2 > out.dat

4b9b3361

Ответ 1

Удалите точку с запятой.

for i in `seq 2`; do echo "$i"; done > out.dat

SUGGESTIONS

Также, как предложил Фредрик Пихл, старайтесь не использовать внешние двоичные файлы, когда они не нужны, или, по крайней мере, когда практически нет:

for i in {1..2}; do echo "$i"; done > out.dat
for ((i = 1; i <= 2; ++i )); do echo "$i"; done > out.dat
for i in 1 2; do echo "$i"; done > out.dat

Кроме того, будьте осторожны с выводами в words, которые могут вызвать расширение имени пути.

for A in $(echo '*'); do echo "$A"; done

Покажет ваши файлы вместо буквального *.

$() также рекомендуется в качестве более четкого синтаксиса для подстановки команд в Bash и оболочках POSIX, чем обратные ссылки (`), и он поддерживает вложенность.

Более чистые решения для считывания выходных данных в переменные

while read VAR; do
    ...   
done < <(do something)

и

read ... < <(do something)  ## Could be done on a loop or with readarray.

for A in "${ARRAY[@]}"; do
    :
done

Использование printf также может быть более простой альтернативой для предполагаемой функции:

printf '%s\n' {1..2} > out.dat

Ответ 2

Другая возможность для полноты: вы можете перемещать вывод внутри цикла, используя >> для добавления к файлу, если он существует.

for i in `seq 2`; do echo $i >> out.dat; done;

Какой из них лучше, конечно, зависит от варианта использования. Написание файла за один раз, конечно, лучше, чем добавление к нему тысячи раз. Кроме того, если цикл содержит несколько операторов echo, все из которых должны идти в файл, выполнение done > out.dat, вероятно, более читаемо и проще в обслуживании. Преимущество этого решения, конечно же, в том, что он дает большую гибкость.

Ответ 3

Try:

(for i in `seq 2`; do echo $i; done;) > out.dat