【问题标题】:multiple colors on output of bash spinnerbash微调器的输出上有多种颜色
【发布时间】:2017-10-27 03:06:29
【问题描述】:

我有这个 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 "$!" '/-\|'

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

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

【问题讨论】:

  • 除非SP_COLOURSP_WIDTHSP_DELAY在别处使用,最好将它们从local改为spinner

标签: bash


【解决方案1】:

多色微调器

#!/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'

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

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

如果你想要一个随机的单色,将构造移动到 tput civis 线下。

注意

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

#!/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'

极限是幻想......

编辑

256色版本

#!/bin/bash

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

sleep 7 &
spinner "$!"

如果你不给它传递参数,我已经为它设置了一个默认值

【讨论】:

    【解决方案2】:

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

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

    然后在微调循环之前,初始化这个数组的索引:

    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 再次显示。

    【讨论】:

    • @Darby_Crash 使用数组,您可以简单地控制以可预测顺序显示的颜色。我看不出这有什么不简单的,我不认为你的解决方案更简单。
    • @Darby_Crash 由于您使用了shuf,这是一个外部进程,我的仅使用本机 Bash 代码的解决方案很可能更快;-)
    • 当我看到您的答案底部时,我正要在问题下添加对tput civistput cnorm 的评论。干得好。
    • @Darby_Crash 好多了。但我不明白为什么它会比我的快。如果其中一种方法比另一种更快,我认为这并不重要。 ;-)
    猜你喜欢
    • 1970-01-01
    • 2013-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    相关资源
    最近更新 更多