Автор Гілка: Тренінг по bash. Урок 2  (Прочитано 4222 раз)

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Потрібно написати скрипт, який малюватиме на екрані квадратики. Точніше потрібно написати три функції:

 * vline - намалювати вертикальну лінію
 * hline - намалювати горизонтальну лінію
 * box - намалювати прямокутник

Підказка:
gotoxy() {
  local x="$1"
  local y="$2"

  tput cup "$y" "$x"
}
[Fedora Linux]

Відсутній Cthulhu

  • Кореспондент
  • ***
  • дописів: 183
  • Карма: +0/-0
Re: Тренінг по bash. Урок 2
« Відповідей #1 : 2007-10-03 20:25:40 »
Мейд он коліно в робочий час:

#!/bin/sh

#
# Functions
#

vline() {
    for x in `seq $2 $3`; do
        gotoxy $1 $x
        echo "*"
    done
    tput cup $lines 0
}

hline() {
    for y in `seq $2 $3`; do
        gotoxy $y $1
        echo "*"
    done
    tput cup $lines 0
}

gotoxy() {
    local x="$1"
    local y="$2"
    tput cup "$y" "$x"
}

box() {
    vline $3 $1 $2
    vline $4 $1 $2
    hline $1 $3 $4
    hline $2 $3 $4
}

#
# The script itself
#

columns=$(tput cols)
lines=$(tput lines)

echo $lines
echo $columns

HOR1=$1
HOR2=$2
VER1=$3
VER2=$4

if [ $HOR1 -gt $lines ] || [ $HOR2 -gt $lines ]; then
    echo "Too large value for vertical line"
    exit 1
fi

if [ $VER1 -gt $columns ] || [ $VER2 -gt $columns ]; then
    echo "Too large value for horizontal line"
    exit 1
fi

clear
#vline $VER1 $HOR1 $HOR2
#vline $VER2 $HOR1 $HOR2
#hline $HOR1 $VER1 $VER2
#hline $HOR2 $VER1 $VER2
box $HOR1 $HOR2 $VER1 $VER2

Наприклад: ./script.sh 10 20 15 40

PS Тьху, горизонтальне з вертикальним переплутав у виводі...
« Змінено: 2007-10-03 23:42:37 від Cthulhu »

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Тренінг по bash. Урок 2
« Відповідей #2 : 2007-10-11 15:02:51 »
Мій варіант:
#!/bin/bash

set -ue

clear

gotoxy() {
  local x="$1"
  local y="$2"
  
  tput cup "$y" "$x"
}

#
# Draw vertical line at given column.
#
vline() {
  local x="$1"
  local from_y="$2"
  local to_y="$3"
  
  local y
  for((y=$from_y;y<=$to_y;y++))
  do
    gotoxy "$x" "$y"
    echo -n "#"
  done
}

#
# Draw horizontal line at given row.
#
hline() {
  local y="$1"
  local from_x="$2"
  local to_x="$3"
  
  gotoxy "$from_x" "$y"
  
  local x
  for((x=$from_x;x<=$to_x;x++))
  do
    echo -n "#"
  done
}

box() {
  local from_x="$1"
  local from_y="$2"
  local to_x="$3"
  local to_y="$4"
  
  vline "$from_x" "$from_y" "$to_y"
  vline "$to_x" "$from_y" "$to_y"
  
  hline "$from_y" "$from_x" "$to_x"
  hline "$to_y" "$from_x" "$to_x"
}

bold() {
  tput smso
}

offbold() {
  tput rmso
}

bold; box 2 2 20 20; offbold

echo
[Fedora Linux]

Відсутній Володимир Лісівка

  • Адміністратор ЩОДО
  • Видавець
  • *****
  • дописів: 3820
  • Карма: +11/-0
  • Програміст
Re: Тренінг по bash. Урок 2
« Відповідей #3 : 2007-10-11 15:10:54 »
Мейд он коліно в робочий час:

hline можна прискорити якщо переходити в потрібні координати лише один раз. Там теоретично можна обійтися і без циклу for якщо заготовити достатньо довгий рядок і з нього вирізати рядок потрібного розміру. (Не робив).

У функціях змінні x та y не зроблені local тому можливі проблеми при використанні в реальних програмах.

Замість використання зовнішньої утиліти seq можна використовувати звичайний цикл for(( ; ; )).

В моєму скрипті функція hline не перевіряє правильність from_x та to_x. Також в моєму скрипті не зроблена перевірка на розміри екрану. :-(

[Fedora Linux]

Відсутній Cthulhu

  • Кореспондент
  • ***
  • дописів: 183
  • Карма: +0/-0
Re: Тренінг по bash. Урок 2
« Відповідей #4 : 2007-10-11 17:47:11 »
Замість використання зовнішньої утиліти seq можна використовувати звичайний цикл for(( ; ; )).
М-дя. Пітон їсть мій мозок... :)