Поскольку изменения в членстве в группе вступают в силу только после запуска новой оболочки входа в систему . Запуск нового сеанса интерактивной оболочки без -входа в систему (, который вы получаете, когда открываете новый терминал ), не имеет значения.
Итак, когда вы запускаете groups
, это печатает группы, в которых в данный момент находится ваш пользователь. Однако они были настроены при первом входе вашего пользователя в систему и не могут быть изменены до тех пор, пока вы снова не войдете в систему. Поэтому groups
не включает вашу новую группу.
С другой стороны, когда вы запускаете groups myuser
, система не ищет группы, текущий пользователь принадлежит в данный момент , она ищет группы которому принадлежит пользователь myuser
, который он получает, читая файл настроек (/etc/group
, предположительно ). Поскольку ваш пользователь настроен на принадлежность к новой группе в /etc/groups
, эта команда также показывает это, даже если вы не в настоящее время в этой группе, так как вы не вошли в систему снова.
Вот моя попытка. Обратите внимание на лучшие имена переменных, переменные в кавычках, без особого случая, без переменных -мутации (, кроме счетчиков циклов ), без комментариев, объясняющих что делает код (, то есть задание кодов, комментарии должны объяснять почему или восполнять недостатки языка )и меньше петель.
#!/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 дней, затем снова через неделю. Продолжайте практиковать аналогичные задачи по кодированию (это как учиться играть на гитаре, вам нужно практиковаться.)
$./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
.
Нижняя строка является специальной и будет напечатана только в том случае, если это позволяет размер треугольника.
Похожие вопросы: