LINUX.ORG.RU

История изменений

Исправление vodz, (текущая версия) :

fortune | cowsay  >  /tmp/cowsay ; 

Так лучше не делать, получится мешанина при двух вызовах.

TMP=`mktemp`
fortune | cowsay  >  $TMP
Точка с запятой там тоже не нужна.

Взгруснулось. Вот вам на bash:

#!/bin/bash

show_n() {
        local i v
        echo -n "$1"
        for ((i=$2;i<$3;i++)); do
                v=$4[$i]
                echo "${!v}"
        done
}

n=0
while IFS='
' read -r l; do
        lines[n++]=$l
done < <(fortune | cowsay)
first=$(($n-20))
show_n "$(tput setaf 1)" 0 $first lines
show_n "$(tput setaf 2)" $first $n lines
echo -n "$(tput setaf 0)"

Для сравнения, на ash:

#!/bin/ash

show_pseudo_array() {
        local i
        echo -n "$1"
        i=$2
        while [ $i -lt $3 ]; do
                i=$(($i+1))
                eval echo \"\$$4$i\"
        done
}

n=0
fortune | cowsay {
while IFS='
' read l; do
        n=$(($n+1))
        eval l$n=\$l
done
first=$(($n-20))
show_pseudo_array "$(tput setaf 1)" 0 $first l
show_pseudo_array "$(tput setaf 2)" $first $n l
echo -n "$(tput setaf 0)"
}

Исправление vodz, :

fortune | cowsay  >  /tmp/cowsay

Так лучше не делать, получится мешанина при двух вызовах.

TMP=`mktemp`
fortune | cowsay  >  $TMP
Точка с запятой там тоже не нужна.

Взгруснулось. Вот вам на bash:

#!/bin/bash

show_n() {
        local i v
        echo -n "$1"
        for ((i=$2;i<$3;i++)); do
                v=$4[$i]
                echo "${!v}"
        done
}

n=0
while IFS='
' read -r l; do
        lines[n++]=$l
done < <(fortune | cowsay)
first=$(($n-20))
show_n "$(tput setaf 1)" 0 $first lines
show_n "$(tput setaf 2)" $first $n lines
echo -n "$(tput setaf 0)"

Для сравнения, на ash:

#!/bin/ash

show_pseudo_array() {
        local i
        echo -n "$1"
        i=$2
        while [ $i -lt $3 ]; do
                i=$(($i+1))
                eval echo \"\$$4$i\"
        done
}

n=0
fortune | cowsay {
while IFS='
' read l; do
        n=$(($n+1))
        eval l$n=\$l
done
first=$(($n-20))
show_pseudo_array "$(tput setaf 1)" 0 $first l
show_pseudo_array "$(tput setaf 2)" $first $n l
echo -n "$(tput setaf 0)"
}

Исходная версия vodz, :

[qoute]

fortune | cowsay  >  /tmp/cowsay
Так лучше не делать, получится мешанина при двух вызовах.
TMP=`mktemp`
fortune | cowsay  >  $TMP
Точка с запятой там тоже не нужна.

Взгруснулось. Вот вам на bash:

#!/bin/bash

show_n() {
        local i v
        echo -n "$1"
        for ((i=$2;i<$3;i++)); do
                v=$4[$i]
                echo "${!v}"
        done
}

n=0
while IFS='
' read -r l; do
        lines[n++]=$l
done < <(fortune | cowsay)
first=$(($n-20))
show_n "$(tput setaf 1)" 0 $first lines
show_n "$(tput setaf 2)" $first $n lines
echo -n "$(tput setaf 0)"

Для сравнения, на ash:

#!/bin/ash

show_pseudo_array() {
        local i
        echo -n "$1"
        i=$2
        while [ $i -lt $3 ]; do
                i=$(($i+1))
                eval echo \"\$$4$i\"
        done
}

n=0
fortune | cowsay {
while IFS='
' read l; do
        n=$(($n+1))
        eval l$n=\$l
done
first=$(($n-20))
show_pseudo_array "$(tput setaf 1)" 0 $first l
show_pseudo_array "$(tput setaf 2)" $first $n l
echo -n "$(tput setaf 0)"
}