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