Randomize argumentos (que guardam códigos de cores) de um array

2

Eu tenho a matriz (mostrada abaixo) com argumentos que contêm códigos de cores.

O objetivo pretendido do meu script é randomizar esses argumentos quando o usuário insere

scriptname randoms Text

para que toda vez que ele exibir o Text na tela em uma cor diferente.

Abaixo escrevi algumas declarações if não relacionadas a este problema em particular, elas funcionam quando eu as testei. O problema que tenho é com cores aleatórias quando o usuário insere

scriptname randoms Text

Aqui está o script:

#!\bin\bash
declare -A colours=(
[black]="0;30" [red]="0;31" [green]="0;32" [yellow]="0;33" [blue]="0;34" [magenta]="0;35" [cyan]="0;36" [white]="0;37"
[BLACK]="1;30" [RED]="1;31" [GREEN]="1;32" [YELLOW]="1;33" [BLUE]="1;34" [MAGENTA]="1;35" [CYAN]="1;36" [WHITE]="1;37"
[bLaCk]="0;30" [rEd]="0;31" [gReEn]="0;32" [yElLoW]="0;33" [bLuE]="0;34" [mAgEnTa]="0;35" [cYaN]="0;36" [wHiTe]="0;37"
[BlAcK]="1;30" [ReD]="1;31" [GrEeN]="1;32" [YeLlOW]="1;33" [BlUe]="1;34" [MaGeNtA]="1;35" [CyAn]="1;36" [WhItE]="1;37")

if [ $# -lt 2 ]; then
        echo Usage: echoc COLOUR STRING
        exit 1
fi
regex='^black$|^red$|^green$|^yellow$|^blue$|^magenta$|^cyan$|^white$'
randoms=$(( $RANDOM % $regex )); echo $randoms
shopt -s nocasematch
if [[ $1 =~ $randoms ]] ; then
        echo -ne '\e['${colours[$randoms]}m
        shift
        echo -e $*'\e[0m'
        exit 2
        fi
    
por Hajir Golmohammadi 12.11.2014 / 02:54

2 respostas

2

Eu não entendo muito bem como você quer que seu script funcione. Eu reescrevi um pouco: imprima todos os argumentos da linha de comando, cada letra em uma cor aleatória:

#!/bin/bash

#     [black]=30
#     [red]=31
#     [green]=32
#     [yellow]=33
#     [blue]=34
#     [magenta]=35
#     [cyan]=36
#     [white]=37
function random_colour {
    local bold=$(( $RANDOM % 2 ))
    local code=$(( 30 + $RANDOM % 8 ))
    printf "%d;%d\n" $bold $code
}

sentence="$*"
for (( i=0; i<${#sentence}; i++ )); do
    printf "\e[%sm%c" "$(random_colour)" "${sentence:i:1}"
done
echo -e '\e[0m'
    
por 12.11.2014 / 04:07
0

com zsh :

zmodload zsh/terminfo
text='some text'
b=(%B '')
print -rP -- ${text//(#m)?/%F{$((RANDOM%terminfo[colors]))}$b[RANDOM%2+1]${MATCH//\%/%%}}%b%f
    
por 12.11.2014 / 08:53