Что не так с использованием перенаправления?

Что не так с использованием перенаправления?
#! /bin/bash
for i in {A,B,C,D,E,F,G,H,J} ; do

     echo     "$i
               $i
               $i
               $i 
               $i
               $i
               $i
               $i"
    cat > ~/Desktop/$i.txt                    
done

Я хочу создать 9 текстовых файлов, каждый из которых будет показывать одну букву, повторяющуюся 8 раз. Например, A.txt должен содержать букву A 8 раз в столбце. Если я запущу скрипт без cat, он действительно покажет мне 8 раз букву A, затем 8 раз B, C и т. д. При вставке оператора catон не работает. Что я делаю не так?

решение1

Это две независимые команды.

echo something
cat > somewhere

Вы можете использовать pipe для передачи stdout в stdin:

echo something | cat > somewhere

решение2

Простым решением этой проблемы будет двойной цикл for, как показано ниже:

for f in {A..J}; do for ((i=0;i<8;i++)); do printf '%s\n' "$f" >> "$f"; done; done

решение3

Вы можете использовать последовательности bash для цикла и разумное использование printf для повторения символов:

for i in {A..J};do printf "$i%.0s\n" {0..7} > ~/Desktop/$i.txt;done

решение4

КакИпор Сирцеруказал, что вы просто пропускаете вертикальную черту между вашим echoи cat. Другим решением было бы использовать yesдля повторения одного и того же текста в нескольких строках и headвместо того, catчтобы ограничить количество строк, например

for i in {A..J}
do
   yes -- "$i" | head -8 >  ~/Desktop/"$i".txt
done

Связанный контент