如何使用模数来包装1到7之间的数字

时间:2017-12-29 19:20:04

标签: bash

我有四个元素我正在改变bash的颜色。要改变颜色,请使用

tput setaf [1-7]

我的第一个元素从1开始,到7,并且使用嵌套循环很好地包裹,但我希望每个元素都遵循左边的元素。 所以,如果我开始

RED GREY BLUE PINK

颜色将变为

GREEN RED GRAY BLUE

然后

黄绿色红色灰色

等等,直到他们回到原来的方向并重复。

我发现的唯一一个用于包围边界数字的例子使用

将边界数字包回到0
x = (x+1) % N

其中x是当前位置(或我的情况下的颜色),N是允许数字到达的最大值,但我想排除0(黑色)。我改成了

(x-1) % N + 1

所以每个元素都在它左边的元素后面加上一个元素以避免变为零,但是每个元素最终因为这个元素而错误地运行了一个错误。

到目前为止,这是我的代码:

K="0"
# iterate through all colors twice
while [ $K -lt 2 ]; do
for j in {1..7}; do
            # just positioning the elements/letters
            tput cup $(( $ROWS / 2 + $ROWS / 8 )) $(( $COLS / 2 ))
                tput setaf $j
                echo -n "T"
                tput setaf $(( ($j - 1) % 7 + 1))
                echo -n "E"
                tput setaf $(( ( $j - 2 ) % 7 ))
                echo -n "S"
                tput setaf $(( ($j - 3) % 7 ))
                echo -n "T"
                sleep 0.5
            done
            (( K++ ))
        done
        tput sgr0

1 个答案:

答案 0 :(得分:1)

由于x % 7会产生0..6范围内的数字,因此您需要加1以获得结果1..7。

tput setaf $(( ($j + 6) % 7 + 1))
echo -n "E"
tput setaf $(( ($j + 5) % 7 + 1))
echo -n "S"
tput setaf $(( ($j + 4) % 7 + 1))
echo -n "T"

注意间距的均匀性;这有助于让我放心,至少有可能代码没问题。我还将减法改为加法;当你取负数的模数时会得到负面结果,这根本没有用。添加6模7相当于减去1模7。