Bash 如何使用模数将数字包裹在1和7之间

Bash 如何使用模数将数字包裹在1和7之间,bash,Bash,我在bash中更改了四个元素的颜色。要更改颜色,我正在使用 tput setaf [1-7] 我有第一个元素,从1开始,到7,使用嵌套循环将其完全环绕,但我希望每个元素都跟随其左侧的元素。 所以如果我从 红灰蓝粉 颜色会变成红色 绿红灰蓝 然后 黄绿红灰 等等,直到他们回到原来的方向并重复 我发现的唯一一个围绕边界包装数字的例子是使用 x = (x+1) % N 其中x是当前位置(在我的例子中是颜色),N是允许数字达到的最大值,但我想排除0(黑色)。我把这个改成了 (x-1) % N + 1

我在bash中更改了四个元素的颜色。要更改颜色,我正在使用

tput setaf [1-7]
我有第一个元素,从1开始,到7,使用嵌套循环将其完全环绕,但我希望每个元素都跟随其左侧的元素。 所以如果我从

红灰蓝粉

颜色会变成红色

绿红灰蓝

然后

黄绿红灰

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

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

x = (x+1) % N
其中x是当前位置(在我的例子中是颜色),N是允许数字达到的最大值,但我想排除0(黑色)。我把这个改成了

(x-1) % N + 1
所以每个元素都跟在左边的那个元素后面,加上一个以避免得到零,但是每个元素最终都会因为这个加法而遇到一个off-by-one错误

以下是我目前的代码:

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

由于
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。

为什么不
$((j+6)%7+1))
?因为我不喜欢这种简写。我喜欢看到前面加有
$
符号的变量引用。你可以随心所欲。