Нарисуйте треугольник на консоли в bash

Поскольку изменения в членстве в группе вступают в силу только после запуска новой оболочки входа в систему . Запуск нового сеанса интерактивной оболочки без -входа в систему (, который вы получаете, когда открываете новый терминал ), не имеет значения.

Итак, когда вы запускаете groups, это печатает группы, в которых в данный момент находится ваш пользователь. Однако они были настроены при первом входе вашего пользователя в систему и не могут быть изменены до тех пор, пока вы снова не войдете в систему. Поэтому groupsне включает вашу новую группу.

С другой стороны, когда вы запускаете groups myuser, система не ищет группы, текущий пользователь принадлежит в данный момент , она ищет группы которому принадлежит пользователь myuser, который он получает, читая файл настроек (/etc/group, предположительно ). Поскольку ваш пользователь настроен на принадлежность к новой группе в /etc/groups, эта команда также показывает это, даже если вы не в настоящее время в этой группе, так как вы не вошли в систему снова.

0
08.04.2020, 14:44
2 ответа

Вот моя попытка. Обратите внимание на лучшие имена переменных, переменные в кавычках, без особого случая, без переменных -мутации (, кроме счетчиков циклов ), без комментариев, объясняющих что делает код (, то есть задание кодов, комментарии должны объяснять почему или восполнять недостатки языка )и меньше петель.

#!/bin/bash
if (($# == 0))
then
    read -r -p "Enter depth of pyramid: " requested_height
elif (($# == 1))
then
    requested_height="$1"
fi
echo "You enetered level: $requested_height"

left_edge="/"
right_edge=\\

#this procedure can be replaced by printf, but shown here to
#demonstrate what to do if a built in does not already exist.
function draw_padding() {
    width="$1"
    for((i=1;i<=width;i++))
    do
        echo -n " "
    done
}

for((line_number=1;line_number<=requested_height;line_number++))
do
    initial_spaces=$((requested_height-line_number))
    draw_padding "$initial_spaces"

    echo -n "$left_edge"

    middle_spaces="$(((line_number-1) * 2  ))"
    draw_padding "$middle_spaces"

    echo "$right_edge"

done

Что я сделал :-Сделайте отступ в коде и хорошо назовите вещи, чтобы я мог их прочитать. -Спросите, что является условным:ВСЕ строки имеют /и \, так что изменяет :пробелы перед и пробелы между ними.

Обратите внимание, что в соответствии с исходной спецификацией это не закончено. И если это задание, они потренируются еще немного. Если вы этого не сделаете, вы столкнетесь со стеной в конце курса. Сегодня напишите эту программу 3 раза, не глядя ни на эту, ни на предыдущие попытки. Затем сделайте это один раз в течение каждого из следующих 3 дней, затем снова через неделю. Продолжайте практиковать аналогичные задачи по кодированию (это как учиться играть на гитаре, вам нужно практиковаться.)

0
28.04.2021, 23:18
$./script.sh
Size: 5
    /\
   /  \
  /    \
 /      \
/________\
#!/bin/bash

read -p 'Size: ' sz

for (( i = 0; i < sz-1; ++i )); do
        printf '%*s/%*s\\\n' "$((sz-i-1))" "" "$((2*i))" ""
done

if [[ $sz -gt 1 ]]; then
        printf '/%s\\\n' "$( yes '_' | head -n "$((2*i))" | tr -d '\n' )"
fi

Я выбрал , а не , чтобы использовать вложенные циклы, поскольку это было бы медленным и ненужным. Вместо этого каждый бит треугольника печатается с использованием printfс форматом, определяющим интервал между символами /и \на основе текущей строки i.

Нижняя строка является специальной и будет напечатана только в том случае, если это позволяет размер треугольника.

Похожие вопросы:

1
28.04.2021, 23:18

Теги

Похожие вопросы