не может создать треугольник в сценарии оболочки с циклом for - PullRequest
0 голосов
/ 02 ноября 2018

Я новичок в сценарии оболочки и пытаюсь немного попрактиковаться. То, что я хочу сделать, это получить вход от пользователя и создать треугольник с помощью цикла for. Например; если пользователь введет 4 в качестве ввода, тогда целевой треугольник будет;

1

2 2

3 3 3

4 4 4 4

Вот мой код:

num=4  ##Assume num is given by user##
for ((i=1; i<=$num; i++))
do
    for ((j=1; j<=i; j++))
    do
        echo $i
    done
    echo " "
done

Выход:

1 22 333 4444

Это связано с «новой линией»? Как я могу это исправить? Кстати, я использую онлайн-терминал терминала. Большое спасибо.

1 Ответ

0 голосов
/ 02 ноября 2018

echo $i печатает значение за переменной i и новой строкой . Вы хотите напечатать новую строку после всех чисел. Используйте переключатель -n.

num=4  ##Assume num is given by user##
for ((i = 1; i <= num; i++))
do
    for ((j = 1; j <= i; j++))
    do
        echo -n "$i "
    done
    echo
    echo
done

Или printf:

num=4  ##Assume num is given by user##
for ((i = 1; i <= num; i++))
do
    for ((j = 1; j <= i; j++))
    do
        printf "%s " "$i"
    done
    printf "\n\n"
done
  1. Не забудьте указать свои переменные (echo "$i", а не echo $i)
  2. Нет необходимости использовать $num внутри (( .. )). Все имена расширяются автоматически.

@ редактировать

При повторном рассмотрении вопроса я предложил следующий oneliner с той же функциональностью:

num=4
seq 1 "$num" | xargs -n1 seq -s ' ' 1
  1. seq 1 "$num" генерирует числа 1 2 .... $ num, разделенные символами новой строки
  2. Затем для каждого числа xargs выполняется seq -s ' ' 1 <number>, генерируя 1 .. число для каждого числа, разделенного пробелами
  3. Вы можете вставить двойные символы новой строки с | sed 's/$/\n/', если необходимо.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...