在bash的控制台上画三角形

在bash的控制台上画三角形

我想使用 中的嵌套循环绘制一个三角形bash,如下所示:

    /\
   /  \
  /    \
 /      \
/________\

这是我的脚本:

#!/bin/bash
read -r -p "Enter depth of pyramid: " n
echo "You enetered level: $n"
s=0
space=n
for((i=1;i<=n;i++))
do
  space=$((space-1)) #calculate how many spaces should be printed before /
  for((j=1;j<=space;j++))
  do
    echo -n " " #print spaces on the same line before printing /
  done
  for((k=1;k<=i;k++))
  do
    if ((i==1))
    then
      echo -n "/\ " #print /\ on the same line
      echo -n " " #print space after /\ on the same line
    elif((k==1))
    then
      echo -n "/" #print / on the same line
    elif((k==i))
    then
      for((l=1;l<=k+s;l++))
      do
        echo -n " " #print spaces on the same line before printing /\
      done
      s=$((s+1)) #as pyramid expands at bottom, so we need to recalculate inner spaces
      echo -n "\ " #print \ on the same line
    fi
  done
  echo -e #print new line after each row
done

请帮我找到简短的版本。

答案1

$ ./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

底行是特殊的,只有在三角形大小允许的情况下才会打印。

类似问题:

答案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

我做了什么: - 缩进代码,并命名好内容,以便我可以阅读它。 - 询问什么是有条件的:全部行有 a/和 a \,那么有什么变化:之前的空格和之间的空格。

请注意,根据原始规格,它尚未完成。如果这是一项作业,他们会多练习一些。如果你不这样做,你就会在课程后期碰壁。今天,将这个程序编写 3 次,不要查看这次或以前的尝试。然后在接下来的 3 天中每天执行一次,然后一周再执行一次。继续练习类似的编码挑战(就像学习弹吉他一样,你必须练习。)

相关内容