bash微调器输出的多种颜色

时间:2017-10-27 03:06:29

标签: bash

我有这个Bash微调代码:

#!/bin/bash
spinner(){
SP_STRING=${2:-"'|/=\'"}
while [ -d /proc/$1 ]
do
    printf "$SP_COLOUR\e7  %${SP_WIDTH}s  \e8\e[0m" "$SP_STRING"
    sleep ${SP_DELAY:-.2}
    SP_STRING=${SP_STRING#"${SP_STRING%?}"}${SP_STRING%?}
done
}

## Adjust to taste (or leave empty)
SP_COLOUR="\e[1;31m"
SP_WIDTH=1.1  ## Try: SP_WIDTH=5.5
SP_DELAY=.3

sleep 7 &
spinner "$!" '/-\|'

有没有办法让它以多种颜色输出微调器?所以每次旋转都会改变颜色。

此外,当微调器运行时,输入线显示在微调器之前并保持在那里直到微调器完成。我可以在代码中编辑什么来使输入行在微调器之下或之后?

2 个答案:

答案 0 :(得分:2)

要在每次旋转中更改颜色,您可以定义颜色数组:

SP_COLORS=("\e[1;31m" "\e[1;32m")

然后在spinner循环之前,将索引初始化为此数组:

local sp_color_index=0

然后在微调器循环内部,递增此索引并适当地旋转它:

((sp_color_index = (sp_color_index + 1) % ${#SP_COLORS[@]}))

然后使用索引从数组中获取下一个颜色:

SP_COLOR=${SP_COLORS[sp_color_index]}
  

此外,当微调器运行时,输入线显示在微调器之前并保持在那里直到微调器完成。我可以在代码中编辑什么来使输入行在微调器之下或之后?

通过"输入行",我猜您指的是光标。 而不是在微调器之下或之后移动光标, 在旋转器循环之前隐藏它可能更好, 然后恢复它。您可以使用tput civis进行隐藏,并使用tput cnorm再次显示。

答案 1 :(得分:2)

多色微调器

for index in stride(from: 0, to: 10, by: 2){
    print(index)
}

我添加了一个构造,每次显示SP_STRING时都会从colors表中获取一个随机数。

我还添加了函数参数的宽度和延迟,并将所有变量设置为本地

如果您想要随机单色,请在tput civis line下移动构造。

注意

你也可以选择颜色并将其传递给函数,如本例中的参数

#!/bin/bash
spinner () {
    local SP_WIDTH="$3"
    local SP_DELAY="$4"
    local SP_STRING=${2:-'/-\|'}
    local SP_COLOR=0
    tput civis
    while [ -d /proc/$1 ]; do
        ((RANDOM%2 == 0)) && SP_COLOR=3$((RANDOM%8)) || SP_COLOR=9$((RANDOM%8))
        printf "\e[1;${SP_COLOR}m\e7  %${SP_WIDTH}s  \e8\e[0m" "$SP_STRING"
        sleep ${SP_DELAY:-.2}
        SP_STRING=${SP_STRING#"${SP_STRING%?}"}${SP_STRING%?}
    done
    tput cnorm
}

sleep 7 &
spinner "$!" '' '1.1' '.3'

极限是幻想......

修改

256色版

#!/bin/bash
spinner () {
    local SP_WIDTH="$3"
    local SP_DELAY="$4"
    local SP_STRING=${2:-'/-\|'}
    local SP_COLOR="$5"
    tput civis
    while [ -d /proc/$1 ]; do
        printf "\e[1;${SP_COLOR}m\e7  %${SP_WIDTH}s  \e8\e[0m" "$SP_STRING"
        sleep ${SP_DELAY:-.2}
        SP_STRING=${SP_STRING#"${SP_STRING%?}"}${SP_STRING%?}
    done
    tput cnorm
}

sleep 7 &
spinner "$!" '' '1.1' '.3' '35'

如果你没有传递参数,我已为其设置了默认值