Contenu | Rechercher | Menus

Annonce

Ubuntu 16.04 LTS
Commandez vos DVD et clés USB Ubuntu-fr !

Pour en savoir un peu plus sur l'équipe du forum.

Appel à contributeurs pour la doc.

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

nombre réponses : 25

#0 -1 »  Différentier les fleches et echap » Hier à 23:12

Hizoka
Réponses : 0

Bonsoir,

je suis confronté à un problème depuis plusieurs heures...

j'ai beau tester plein de trucs mais rien à y faire...

soit :

Touche=" "

while [[ ${Touche} ]]
do
  IFS= read -r -sn 1 Touche

  case "${Touche}" in
    $'\033') echo "033";;
    $'\104') echo "104";;
    $'\103') echo "103";;
    $'\101') echo "101";;
    $'\102') echo "102";;
    $'\133') echo "133";;
    *) echo "et plein dautres trucs..." ;;
  esac
done

En sachant qu'en appuyant sur  :

echap : 033
haut :033 - 133 - 101
bas : 033 - 133 - 102
gauche : 033 - 133 - 104
droite : 033 - 133 - 103

Comment faire (sans quitter la boucle pour savoir si j'ai appuyer sur echap ?!
J'ai essayé de passer par des variables, des testes de la la variable Touche...
mais rien n'y fait...

Une idée ?!

Merci !

#1 -1 »  Quelques retours pour mon script ? » Le 18/08/2017, à 09:05

Hizoka
Réponses : 18

Bonjour à vous,

je vous propose un script que j'ai fait, je voulais un petit retour dessus (si vous pouvez car je sais que ça demande du temps), je prends les améliorations, les erreurs, les bugs, les idées... afin de faire un truc propre qui pourrait servir à d'autres.

Présentation : Il permet d'afficher une "question" et une liste de proposition à la manière de la commande select mais avec :
- de la couleur ou non...
- la possibilité de choix multiple
- la possibilité de limiter le nombre de choix
- la possibilité ajouter une description ou commentaire aux propositions
- la possibilité de renvoyer la valeur, le numéro ou bien une valeur cachée
Une petite vidéo pour montrer à quoi ça ressemble : https://asciinema.org/a/Sn69EBsItyjgfEUrkoPoAwcrx

J'ai fait une version fr et en (mais vu mon petit niveau, ça doit être bourré de fautes XD )

Je mets ici le fichier ainsi que les manpages (fr et en) qu'on peut afficher via la commande man ./multiselect1.fr.1

Et sinon voici le code :

#!/bin/bash


### Fonction arrêtant la commande en mode erreur avec le texte d'erreur
function ExitErreur
{
# Renvoie le texte par défaut
echo -e "${ErrorText}"

# Arrêt problématique
exit 1
}


### Textes en fr et en
function LangText
{
# Remplissage du tableau dans la bonne langue
if [[ ${Lang} == fr ]]
then
    case "${1,,}" in
        "all") echo -e "${ColorNumbers}*${ColorUnset}) ${ColorValues}${AllText:-Sélectionne toutes les réponses}${ColorUnset}" ;;
        "argument") echo -e "${ColorErrors}L'argument ${2} nécessite une valeur.${ColorUnset}" ;;
        "default") echo -e "${ColorErrors}L'argument default ne peut contenir que des chiffres et des espaces.${ColorUnset}" ;;
        "error_all") echo -e "${ColorErrors}* doit être utilisé seule.${ColorUnset}" ;;
        "error_unknow") echo -e "${ColorErrors}L'argument ${2} est inconnu.${ColorUnset}" ;;
        "error_insufficient") echo -e "${ColorErrors}Nombre de proposition insuffisant.${ColorUnset}" ;;
        "error_limit") echo -e "${ColorErrors}Nombre de sélection dépassant la limite qui est de ${2}.${ColorUnset}" ;;
        "error_number") echo -e "${ColorErrors}Erreur dans la sélection, il faut rentrer un/des chiffre(s) parmi ceux proposés.${ColorUnset}" ;;
        "one_choice_with_title") echo -e "${ColorNumbers}${Title}${ColorUnset} ( ${ColorValues}Un seul choix possible.${ColorUnset} )\n" ;;
        "one_choice_without_title") echo -e "${ColorValues}Un seul choix possible.${ColorUnset}\n" ;;
        "multi_choice_with_title") echo -e "${ColorNumbers}${Title}${ColorUnset} ( ${ColorValues}${Limit} choix possibles.${ColorUnset} )\n" ;;
        "multi_choice_without_title") echo -e "${ColorValues}${Limit} choix possibles.${ColorUnset}\n" ;;
        "wait_text") echo "${WaitText:-Sélection : }" ;;
        "help") echo -e "\n${ColorNumbers}Utilisation :${ColorUnset}
\t${ColorNumbers}multiselect ${ColorErrors}--title ${ColorUnset}\"${ColorValues}Question${ColorUnset}\" \"${ColorCommentary}réponse1${ColorUnset}\" \"${ColorCommentary}réponse2${ColorUnset}\"...
\t${ColorNumbers}multiselect ${ColorErrors}--all --limit ${ColorValues}1${ColorErrors} \"${ColorCommentary}réponse1${ColorUnset}\" \"${ColorCommentary}réponse2${ColorUnset}\"...
\t${ColorNumbers}multiselect ${ColorErrors}--numbers --wait ${ColorUnset}\"${ColorValues}J'attends après vous...${ColorUnset}\" \"${ColorCommentary}réponse1${ColorUnset}\" \"${ColorCommentary}réponse2${ColorUnset}\"...
\t${ColorNumbers}multiselect ${ColorErrors}--secret ${ColorUnset}\"${ColorValues}<=>${ColorUnset}\" \"${ColorCommentary}réponse1<=>secret1${ColorUnset}\" \"${ColorCommentary}réponse2<=>secret2${ColorUnset}\"...

${ColorNumbers}Options :${ColorUnset}
\t${ColorErrors}-a, --all${ColorValues}=text${ColorUnset}\t\t\tAjout d'une valeur pour tout sélectionner,
\t\t\t\t\tle = est obligatoire pour modifier son texte.
\t${ColorErrors}--color-numbers${ColorValues} couleur${ColorUnset}\t\tCouleur des nombres.
\t${ColorErrors}--color-values${ColorValues} couleur${ColorUnset}\t\tCouleur des valeurs.
\t${ColorErrors}--color-commentary${ColorValues} couleur${ColorUnset}\tCouleur des commentaires.
\t${ColorErrors}--color-error${ColorValues} couleur${ColorUnset}\t\tCouleur des messages d'erreur.
\t${ColorErrors}-c, --commentary${ColorValues} texte${ColorUnset}\t\tSéparateur entre la valeur à afficher et son commentaire.
\t${ColorErrors}-d, --default${ColorValues} réponse(s)${ColorUnset}\tRéponses pré-remplies.
\t${ColorErrors}-e, --error${ColorValues} texte${ColorUnset}\t\tTexte à renvoyer en cas d'erreur / non sélection en code 1.
\t${ColorErrors}-h, -?, --help${ColorValues}${ColorUnset}\t\t\tAffiche ce texte d'aide.
\t${ColorErrors}-i, --input${ColorValues} entier${ColorUnset}\t\tEn cas d'utilisation de la commande dans une boucle while.
\t${ColorErrors}--lang${ColorValues} lang${ColorUnset}\t\t\tLangue à utiliser entre fr et en.
\t${ColorErrors}-l, --limit${ColorValues} entier${ColorUnset}\t\tNombre maximal de réponse possible.
\t${ColorErrors}--no-colors${ColorValues}${ColorUnset}\t\t\tNe pas colorer les textes affichés.
\t${ColorErrors}-n, --numbers${ColorValues}${ColorUnset}\t\t\tRenvoyer les numéros de sélection avec les textes.
\t${ColorErrors}-s, --secret${ColorValues} texte${ColorUnset}\t\tSéparateur des valeurs cachées.
\t${ColorErrors}-t, --title${ColorValues} texte${ColorUnset}\t\tTexte à afficher avant la liste de réponses.
\t${ColorErrors}-v, --version${ColorValues} texte${ColorUnset}\t\tVersion de la commande MultiSelect.
\t${ColorErrors}-w, --wait${ColorValues} texte${ColorUnset}\t\tTexte à afficher lors de l'attente du choix.

${ColorNumbers}Plus d'informations :${ColorUnset}
\t${ColorNumbers}man ${ColorValues}multiselect${ColorUnset}" ;;
    esac

else
    case "${1,,}" in
        "all") echo -e "${ColorNumbers}\*${ColorUnset}) ${ColorValues}${AllText:-Select all answers}${ColorUnset}" ;;
        "argument") echo -e "${ColorErrors}${2} argument needs value.${ColorUnset}" ;;
        "default") echo -e "${ColorErrors}default argument can only contain numbers and spaces.${ColorUnset}" ;;
        "error_all") echo -e "${ColorErrors}* needs to used alone.${ColorUnset}" ;;
        "error_unknow") echo -e "${ColorErrors}The ${2} argument is unknow.${ColorUnset}" ;;
        "error_insufficient") echo -e "${ColorErrors}Number of proposals insufficient.${ColorUnset}" ;;
        "error_limit") echo -e "${ColorErrors}Number of selections exceeding the limit of ${2}.${ColorUnset}" ;;
        "error_number") echo -e "${ColorErrors}Error in the selection, it is necessary to enter one/multi of the proposed ones.${ColorUnset}" ;;
        "one_choice_with_title") echo -e "${ColorNumbers}${Title}${ColorUnset} ( ${ColorValues}Only one choice possible.${ColorUnset} )\n" ;;
        "one_choice_without_title") echo -e "${ColorValues}Only one choice possible.${ColorUnset}\n" ;;
        "multi_choice_with_title") echo -e "${ColorNumbers}${Title}${ColorUnset} ( ${ColorValues}${Limit} possible choices.${ColorUnset} )\n" ;;
        "multi_choice_without_title") echo -e "${ColorValues}${Limit} possible choices.${ColorUnset}\n" ;;
        "wait_text") echo "${WaitText:-Selection: }" ;;
        "help") echo -e "\n${ColorNumbers}Use:${ColorUnset}
\t${ColorNumbers}multiselect ${ColorErrors}--title ${ColorUnset}\"${ColorValues}Question${ColorUnset}\" \"${ColorCommentary}answer1${ColorUnset}\" \"${ColorCommentary}answer2${ColorUnset}\"...
\t${ColorNumbers}multiselect ${ColorErrors}--all --limit ${ColorValues}1${ColorErrors} \"${ColorCommentary}answer1${ColorUnset}\" \"${ColorCommentary}answer2${ColorUnset}\"...
\t${ColorNumbers}multiselect ${ColorErrors}--numbers --wait ${ColorUnset}\"${ColorValues}I wait after you...${ColorUnset}\" \"${ColorCommentary}answer1${ColorUnset}\" \"${ColorCommentary}answer2${ColorUnset}\"...
\t${ColorNumbers}multiselect ${ColorErrors}--secret ${ColorUnset}\"${ColorValues}<=>${ColorUnset}\" \"${ColorCommentary}answer1<=>secret1${ColorUnset}\" \"${ColorCommentary}answer2<=>secret2${ColorUnset}\"...

${ColorNumbers}Options:${ColorUnset}
\t${ColorErrors}-a, --all${ColorValues}=text${ColorUnset}\t\t\tAdd a answer to select all with a text,
\t\t\t\t\tneed to use = for change the text.
\t${ColorErrors}--color-numbers${ColorValues} color${ColorUnset}\t\tColor to use for the numbers.
\t${ColorErrors}--color-values${ColorValues} color${ColorUnset}\t\tColor to use for the values.
\t${ColorErrors}--color-commentary${ColorValues} color${ColorUnset}\tColor to use for the commentaries.
\t${ColorErrors}--color-error${ColorValues} color${ColorUnset}\t\tColor to use for the error messages.
\t${ColorErrors}-c, --commentary${ColorValues} text${ColorUnset}\t\tSeparator of the commentaries.
\t${ColorErrors}-d, --default${ColorValues} answer(s)${ColorUnset}\t\tPre-filled answers.
\t${ColorErrors}-e, --error${ColorValues} text${ColorUnset}\t\tText to return in case of error or non-selection with code 1.
\t${ColorErrors}-h, -?, --help${ColorValues}${ColorUnset}\t\t\tDisplay this help text.
\t${ColorErrors}-i, --input${ColorValues} int${ColorUnset}\t\t\tIf you use while loop with multiselect, you will need it.
\t${ColorErrors}--lang${ColorValues} lang${ColorUnset}\t\t\tLanguage to use between fr and en.
\t${ColorErrors}-l, --limit${ColorValues} int${ColorUnset}\t\t\tMaximal number of answers.
\t${ColorErrors}--no-colors${ColorValues}${ColorUnset}\t\t\tDo not color the texts displayed.
\t${ColorErrors}-n, --numbers${ColorValues}${ColorUnset}\t\t\tReturn the numbers with the values.
\t${ColorErrors}-s, --secret${ColorValues} text${ColorUnset}\t\tSeparator of the hidden values.
\t${ColorErrors}-t, --title${ColorValues} text${ColorUnset}\t\tText to display before the list of answers.
\t${ColorErrors}-v, --version${ColorValues} text${ColorUnset}\t\tVersion of MultiSelect command.
\t${ColorErrors}-w, --wait${ColorValues} text${ColorUnset}\t\t\tText to display while waiting for the choice.

${ColorNumbers}More infos:${ColorUnset}
\t${ColorNumbers}man ${ColorValues}multiselect${ColorUnset}" ;;
    esac
fi
}









### Variables par défaut
Version="1 - 19/08/2017"
Limit=0
CommentarySeparator="@@"
ErrorText="Exit"
Input=0
Lang=${LANG:0:2}


### Couleurs
ColorUnset="\e[m"
ColorNumbers="\033[1;35m"
ColorValues="\033[1;34m"
ColorCommentary="\033[1;32m"
ColorErrors="\033[1;31m"


### Traitement des arguments
# getopts ne sert qu'en cas d'utilisation de argument d'1 lettre et qu'on puisse les assembler, donc pas d'interet ici
# utilisation de ${@} et non de ${1} car si la variable est vide ça stoppe
while [[ ${@} ]]
do
    # Variable stoppant les arguments
    if [[ -z ${StopArg} ]]
    then
        # Teste chaque argument
        # Les shift internes servent pour décaler d'un niveau de plus pour éliminer la valeur ${2}
        case ${1,,} in
            "--")
                # Valeur spéciale permettant d'indiquer que les arguments sont términées
                StopArg=true ;;

            "-a"|"--all")
                # Argument all sans valeur
                All=true ;;

            "-a="*|"--all="*)
                # Argument all avec valeur
                All=true
                AllText="${1#*=}" ;;

            "--color-numbers")
                [[ ${2} != -* ]] && ColorNumbers="${2}"
                [[ -z ${ColorNumbers} ]] && { LangText argument color-numbers; ExitErreur; }
                shift ;;

            "--color-values")
                [[ ${2} != -* ]] && ColorValues="${2}"
                [[ -z ${ColorValues} ]] && { LangText argument color-values; ExitErreur; }
                shift ;;

            "--color-commentary")
                [[ ${2} != -* ]] && ColorCommentary="${2}"
                [[ -z ${ColorCommentary} ]] && { LangText argument color-commentary; ExitErreur; }
                shift ;;

            "--color-error")
                [[ ${2} != -* ]] && ColorErrors="${2}"
                [[ -z ${ColorErrors} ]] && { LangText argument ColorErrors; ExitErreur; }
                shift ;;

            "-c"|"--comentary")
                [[ ${2} != -* ]] && CommentarySeparator="${2}"
                [[ -z ${CommentarySeparator} ]] && { LangText argument commentary; ExitErreur; }
                shift ;;

            "-d"|"--default")
                [[ ${2} != -* ]] && Default="${2}"
                [[ -z ${Default} ]] && { LangText argument default; ExitErreur; }
                [[ ${Default} =~ ^[0-9\ \*]*$ ]] || { LangText default; ExitErreur; }
                shift ;;

            "-e"|"--error")
                [[ ${2} != -* ]] && ErrorText="${2}"
                [[ -z ${ErrorText} ]] && { LangText argument error ExitErreur; }
                shift ;;

            "-h"|"-?"|"--help")
                LangText help >&2
                exit 0 ;;

            "-i"|"--input")
                [[ ${2} != -* ]] && Input="${2}"
                [[ -z ${Input} ]] && { LangText argument input; ExitErreur; }
                shift ;;

            "--lang")
                [[ ${2} != -* ]] && Lang="${2}"
                [[ -z ${Lang} ]] && { LangText argument lang; ExitErreur; }
                shift ;;

            "-l"|"--limit")
                [[ ${2} != -* ]] && Limit="${2}"
                [[ -z ${Limit} ]] && { LangText argument limit; ExitErreur; }
                shift ;;

            "--no-color")
                # Destruction des couleurs
                unset ColorUnset ColorErrors ColorNumbers ColorValues ColorCommentary ;;

            "-n"|"--numbers")
                Numbers=true ;;

            "-s"|"--secret")
                [[ ${2} != -* ]] && SecretSeparator="${2}"
                [[ -z ${SecretSeparator} ]] && { LangText argument secret; ExitErreur; }
                shift ;;

            "-t"|"--title")
                [[ ${2} != -* ]] && Title="${2}"
                [[ -z ${Title} ]] && { LangText argument title; ExitErreur; }
                shift ;;

            "-v"|"--version")
                echo "MultiSelect version ${Version}." >&2
                exit 0 ;;

            "-w"|"--wait")
                [[ ${2} != -* ]] && WaitText="${2}"
                [[ -z ${WaitText} ]] && { LangText argument wait; ExitErreur; }
                shift ;;

            -*)
                # Si un autre argument est donné
                LangText error_unknow ${1}; ExitErreur ;;

            *)
                # Si c'est du texte sans argument, c'est que c'est une réponse possible
                # Si la variable est vide, on ne la prend pas
                [[ ${1} ]] && Choix+=("${1}") ;;
        esac

    else
        # Si on est ici, c'est qu'on a utilisé --, du coup, tout ce qui suit sert de proposition
        # Si la variable est vide, on ne la prend pas
        [[ ${1} ]] && Choix+=("${1}")
    fi

    # On décale les arguments ${1} est détruit, ${2} devient ${1}, ${3} devient ${2}...
    shift
done


### Verifie qu'il y a bien des propositions
[[ ${#Choix[@]} < 1 ]] && { LangText error_insufficient; ExitErreur; }


### Gestion du message d'explication
# Message apparaissant avant la liste
if [[ ${Title} && ${Limit} > 0 ]]
then
    # Message précisant le nombre de choix possibles
    [[ ${Limit} = 1 ]] && LangText one_choice_with_title >&2 || LangText multi_choice_with_title >&2

elif [[ ${Title} && ${Limit} < 1 ]]
then
    # Message simple
    echo -e "${ColorNumbers}${Title}${ColorUnset}\n" >&2

elif [[ -z ${Title} && ${Limit} > 0 ]]
then
    # Message indiquant uniquement le nombre de choix possible
    [[ ${Limit} = 1 ]] && LangText one_choice_without_title >&2 || LangText multi_choice_without_title >&2

else
    # S'il n'y a pas de message, saut de ligne esthétique
    echo >&2
fi


### Affichage des propositions
# Mode toutes les valeurs
[[ ${All} ]] && LangText all >&2

# Liste des propositions
for Number in "${!Choix[@]}"
do
    # Destruction des variables
    unset LoopText LoopCom

    # Variables pour la boucle
    LoopText=${Choix[${Number}]}
    [[ "${CommentarySeparator}" && "${LoopText}" =~ "${CommentarySeparator}" ]] && { LoopCom=${LoopText##*${CommentarySeparator}}; LoopText=${LoopText%%${CommentarySeparator}*}; }
    [[ "${SecretSeparator}" && "${LoopText}" =~ "${SecretSeparator}" ]] && LoopText=${LoopText%%${SecretSeparator}*}
    [[ "${SecretSeparator}" && "${LoopCom}" =~ "${SecretSeparator}" ]]  && LoopCom=${LoopCom%%${SecretSeparator}*}

    # Recherche le signe servant de séparateur entre la valeur et la description
    if [[ "${LoopCom}" ]]
    then
        # Si séparateur présent : affichage du numéro, de la valeur du texte et de la description
        echo -e "${ColorNumbers}${Number}${ColorUnset}) ${ColorValues}${LoopText}${ColorUnset} : ${ColorCommentary}${LoopCom}${ColorUnset}" >&2

    else
        # Si pas de séparateur : affichage du numéro et de la valeur du texte
        echo -e "${ColorNumbers}${Number}${ColorUnset}) ${ColorValues}${LoopText}${ColorUnset}" >&2
    fi
done


### Attente des réponses
echo >&2
read -u ${Input} -e -i "${Default}" -p "$(LangText wait_text)" -a Reponses


### Traitement des erreurs
# Message d'erreur indiquant un nombre de reponse trop élevé
[[ ${Limit} > 0 && ${#Reponses[@]} -gt ${Limit:-999} ]] && { LangText error_limit ${Limit}; ExitErreur; }

# Si la réponse n'est pas un nombre ou que ce nombre dépasse le nombre de réponse possible
for Number in "${Reponses[@]}"
do
    [[ ${Number} != "*"  && -z $(grep -w ${Number} <<< "${!Choix[@]}") ]] && { LangText error_number; ExitErreur; }
done

# Si la * n'est pas seule
[[ $(grep -w ".\*\|\*." <<< "${Reponses[@]}") ]] && { LangText error_all; ExitErreur; }


### S'il n'y a eu aucune réponse, renvoie le texte par défaut
[[ -z ${Reponses} ]] && ExitErreur


### Si le mode all est activé, on recherche son utilisation
if [[ ${All} == true ]]
then
    # Recherche la valeur *
    if [[ $(printf "%s\n" "${Reponses[@]}" | grep '^\*$') ]]
    then
        # Traitement des retours séparés des erreurs
        for Number in "${!Choix[@]}"
        do
            # Destruction des variables
            unset LoopText LoopSecretText

            # Variables pour la boucle
            LoopText=${Choix[${Number}]}
            [[ "${CommentarySeparator}" && "${LoopText}" =~ "${CommentarySeparator}" ]] && LoopText=${LoopText%%${CommentarySeparator}*}
            [[ "${SecretSeparator}" && "${LoopText}" =~ "${SecretSeparator}" ]] && LoopText=${LoopText%%${SecretSeparator}*}
            [[ "${SecretSeparator}" && "${Choix[${Number}]}" =~ "${SecretSeparator}" ]]  && LoopSecretText=${Choix[${Number}]##*${SecretSeparator}}

            # Détermine le texte à renvoyer
            if [[ ${Numbers} && ${SecretSeparator} && ${LoopSecretText}  ]]
            then
                # Renvoie le numéro de ligne avec le texte caché
                echo "${Number}:${LoopSecretText}"

            elif [[ ${Numbers} ]]
            then
                # Si le texte à renvoyer vaut le texte d'erreur on l'envoie et saute le tour
                [[ ${ErrorText} == ${LoopText} ]] && continue

                # Renvoie le numero de ligne avec le texte
                echo "${Number}:${LoopText}"

            elif [[ ${SecretSeparator} && ${LoopSecretText} ]]
            then
                # Ne renvoie que le texte caché
                echo "${LoopSecretText}"

            else
                # Si le texte à renvoyer vaut le texte d'erreur on l'envoie et saute le tour
                [[ ${ErrorText} == ${LoopText} ]] && continue

                # Ne renvoie que le texte
                echo "${LoopText}"
            fi
        done
    fi

else
    ### Traitement des retours séparés des erreurs
    for Number in "${Reponses[@]}"
    do
        # Destruction des variables
        unset LoopText LoopSecretText

        # Variables pour la boucle
        LoopText=${Choix[${Number}]}
        [[ "${CommentarySeparator}" && "${LoopText}" =~ "${CommentarySeparator}" ]] && LoopText=${LoopText%%${CommentarySeparator}*}
        [[ "${SecretSeparator}" && "${LoopText}" =~ "${SecretSeparator}" ]] && LoopText=${LoopText%%${SecretSeparator}*}
        [[ "${SecretSeparator}" && "${Choix[${Number}]}" =~ "${SecretSeparator}" ]]  && LoopSecretText=${Choix[${Number}]##*${SecretSeparator}}

        # Détermine le texte à renvoyer
        if [[ ${Numbers} && ${SecretSeparator} && ${LoopSecretText}  ]]
        then
            # Renvoie le numéro de ligne avec le texte caché
            echo "${Number}:${LoopSecretText}"

        elif [[ ${Numbers} ]]
        then
            # Si le texte à renvoyer vaut le texte d'erreur on l'envoie et quitte en mode erreur
            [[ ${ErrorText} == ${LoopText} ]] && ExitErreur

            # Renvoie le numero de ligne avec le texte
            echo "${Number}:${LoopText}"

        elif [[ ${SecretSeparator} && ${LoopSecretText} ]]
        then
            # Ne renvoie que le texte caché
            echo "${LoopSecretText}"

        else
            # Si le texte à renvoyer vaut le texte d'erreur on l'envoie et quitte en mode erreur
            [[ ${ErrorText} == ${LoopText} ]] && ExitErreur

            # Ne renvoie que le texte
            echo "${LoopText}"
        fi
    done
fi

### Arrêt normal
exit 0

Commandes de la vidéo de présentation :

multiselect --lang en --title "Hi, what do you hate ?" \
"Mondays@@Yes I hate the mondays..." \
"Gun@@Fucking murderer !" \
"Hospital@@I don't like the stings" \
"Clowns@@I think to the book It" \
"Punks and rastas@@I'm afraid of they hairs" \
"Others@@Yep, I hate so many things... I'm so sad :("
 
# eg with return of numbers and texts and a limit of 3 answers
multiselect --lang en --numbers --limit 3 --title "Hi, what do you hate ?" \
"Mondays@@Yes I hate the mondays..." \
"Gun@@Fucking murderer !" \
"Hospital@@I don't like the stings" \
"Clowns@@I think to the book It" \
"Punks and rastas@@I'm afraid of they hairs" \
"Others@@Yep, I hate so many things... I'm so sad :("
 
# eg with a limit of 1 answer
multiselect --lang en --limit 1 --title "Hi, what do you hate most ?" \
"Mondays@@Yes I hate the mondays..." \
"Gun@@Fucking murderer !" \
"Hospital@@I don't like the stings" \
"Clowns@@I think to the book It" \
"Punks and rastas@@I'm afraid of they hairs" \
"Other@@It's not in the list"
 
# eg with a limit of 1 answer and return number and hidden text
multiselect --lang en --limit 1 --secret "~=~" --number --title "Hi, what do you hate most ?" \
"Mondays@@Yes I hate the mondays...~=~mon" \
"Gun@@Fucking murderer ! ~=~gun" \
"Hospital@@I don't like the stings~=~hos" \
"Clowns@@I think to the book It~=~clo" \
"Punks and rastas@@I'm afraid of they hairs~=~pun" \
"Other@@It's not in the list~=~oth"

Exemple de commandes que j'utilise :

multiselect --title "Selectionnez les dépots à installer parmi cette liste" \
"Autre@@Ajouter un ppa n'apparraissant pas dans la liste" \
"AntiMicro@@Logiciel de gestion de manettes (Association de touches et de commandes)" \
"Back in time@@Depot Dev du logiciel de sauvegarde Back in time" \
"Chromium@@Derniere version du navigateur Chromium" \
"Handbrake@@Encodeur vidéo" \
"Kiesse@@Mon jeu de type qui est-ce ?" \
"Kubuntu Backport" \
"MangaPanda@@Mon logiciel de téléchargement de lecture en ligne de mangas" \
"MKVExtractorGui@@Mon logiciel d'extraction de pistes depuis des fichiers mkv" \
"MKVToolNix@@Version plus récente de MKVToolNix" \
"MultiSystem@@Gestionnaire de multiboot USB" \
"Libre Office@@Suite de logiciel de texte et tableur en version stable" \
"Libre Office pre-release@@Suite de logiciel de texte et tableur en version pré release" \
"Oqapy@@Logiciel de téléchargement des vidéos d'Arté" \
"Play On Linux@@Simplifie la gestion de Wine" \
"Screencastor@@Mon logiciel de capture vidéo d'écran" \
"Smplayer@@Lecteur vidéo en derniere version" \
"Skrooge@@Gestionnaire de compte bancaire" \
"Virtualbox@@Virtualisation de PC" \
"vlc Stable@@Lecteur vidéo en version plus récente" \
"vlc Dev@@Lecteur vidéo en version Dev" \
"Y PPA Manager@@Gestionnaire de PPA" \
"Zenitor@@Mon logiciel de créatio de code Zenity" \
"Exit"

multiselect --limit 1 --title "Liste des fichiers csv :" *.csv "Exit"

Merci à vous.

Fichier : http://hizo.fr/multiselect_v1.7z

PPA :

sudo add-apt-repository ppa:hizo/bash
sudo apt update
sudo apt install multiselect

le deb est dispo aussi : https://launchpad.net/~hizo/+archive/ub … /+packages

Dernière version a écrit :

Beaucoup de changements...
Mise à jour des manpages et du texte d'aide
Remplacement de --all et --all-text par --all[=text]
Ajout de la possibilité d'utiliser des arguments courts
Modification complète du système de traitement des arguments

Dernière version a écrit :

Modification du système de texte
Modification du système de couleurs et ajout des arguments des couleurs (--color-numbers --color-values --color-commentary --color-error)
Ajout de --default pour pré-rentrer des réponses
Ajout de --all pour ajouter une ligne pour toutes les sélectionner
Ajout de --all-text pour modifier le texte de la réponse *
Modification de nombreux noms de variables

#2 Re : -1 »  Quelques retours pour mon script ? » Le 18/08/2017, à 15:43

Hizoka
Réponses : 18

Salut, merci pour les idées.
Je vais les y ajouter en effet.
Je vais également permettre la modification des couleurs afin que ce soit vraiment personnalisable.

#3 Re : -1 »  Quelques retours pour mon script ? » Le 18/08/2017, à 19:43

Hizoka
Réponses : 18
moko138 a écrit :

À propos de couleurs,
FUSHIA  -->  FUCHSIA

La vache... je l'ai jamais bien écrit alors...
merci smile

Anonyme68 a écrit :

Sympa le travail, en utilisant l'option --no-color on obtient une erreur]

Merci smile
oups en effet une erreur de copier coller...

kholo a écrit :

il manquerait la possibilité de tout sélectionner par exemple avec * à la place des nombres...

il faudrait que ça renvoie * ( et c'est le programmeur qui se débrouille avec ça) ou toutes les valeurs (dans ce cas il faudrait ne pas renvoyer exit mais surement plus pratique à utiliser) ?
Et visuellement j'ajoute une ligne avec pour numéro * et un texte indiquant son intérêt ?

kholo a écrit :

un affichage d'une présélection par défaut lors du choix qu'il suffirait de valider (si on laisse vide la réponse)

Ce qui serait parfait, ça serait de pouvoir préecrire un texte qu'on puisse supprimer ou valider...

read -e -i "1 2 3" -p "test : "

c'est good ça smile

kholo a écrit :

... pour le moment c'est un exit je crois...

Je pense laisser ça comme ça, car on peut considérer que ne rien valider c'est ne pas faire de choix.
Mais si on arrive pas à trouver de solution pour ci-dessus, il faudra peut être faire un système : si pré valeur et qu'on valide à vide ça passe et sinon ça fait un exit...

#4 Re : -1 »  Quelques retours pour mon script ? » Le 18/08/2017, à 23:20

Hizoka
Réponses : 18
Dernière version a écrit :

Modification du système de texte
Modification du système de couleurs et ajout des arguments des couleurs (--color-numbers --color-values --color-commentary --color-error)
Ajout de --default pour pré-rentrer des réponses
Ajout de --all pour ajouter une ligne pour toutes les sélectionner
Ajout de --all-text pour modifier le texte de la réponse *
Modification de nombreux noms de variables

Merci de me faire quelques retours et me donner vos autres idées smile

Le fichier 7z a été mis à jour aussi bien le script que les manpages.

exemple :

multiselect --color-numbers "\033[1;31m" --default "0 3" --all --all-text "Ouesh gros" a b c d e Exit

Que mettriez vous dans l'aide appelée via l'argument --help ?

Que vaut il mieux faire :
proposer les arguments --all et --all-text
ne proposer que --all avec une valeur facultative pour le texte mais si --all est utilisé juste avant les valeurs réponses alors il prend la 1ere valeur pour son texte... il faut du coup préciser --all ""...
qu'en pensez vous ?

Edit : Les manpages ne sont pas vraiment à jour en fait tongue

#5 Re : -1 »  Quelques retours pour mon script ? » Le 19/08/2017, à 13:28

Hizoka
Réponses : 18

Fichier : http://hizo.fr/multiselect_v1.7z

Dernière version a écrit :

Beaucoup de changements...
Mise à jour des manpages et du texte d'aide
Remplacement de --all et --all-text par --all[=text]
Ajout de la possibilité d'utiliser des arguments courts
Modification complète du système de traitement des arguments

Création d'un PPA :

sudo add-apt-repository ppa:hizo/bash
sudo apt update
sudo apt install multiselect

et du coup, le deb est dispo aussi : https://launchpad.net/~hizo/+archive/ub … /+packages

D'autres idées ? car la je suis chaud XD

#6 Re : -1 »  Quelques retours pour mon script ? » Le 19/08/2017, à 17:23

Hizoka
Réponses : 18

Il y a une vérification faites après coup, mais ça ne semble pas possible de limiter les caractères utilises dans read.

Je vais voir ta proposition en cas de - 10 de propositions.

la surbrillance est à mon avis impossible car on est coincé dans read...

Pour commencer à 1, c'est pas trop l'idée vu que je passe par une liste, mais ça devrait être possible.

Sinon je viens d'ajouter la possibilité de ne récupérer que les numéros.
j'ai ajouté un système de complétions des arguments également.
Cette version n'est pas encore sortie.

#7 Re : -1 »  Quelques retours pour mon script ? » Le 19/08/2017, à 20:04

Hizoka
Réponses : 18

Bien pensé... lourdingue à gerer mais sympa tongue

ReponsesTemp="$(LangText wait_text)"
Touche=" "
Rang=0

echo -n "${ReponsesTemp}"

until [[ -z ${Touche} ]]
do
    IFS= read -n 1 -s Touche # Travaille sur un seul caractere et cache les touches

    case "${Touche}" in
        [0-9])
            # Ajout des chiffres
            ReponsesTemp+="${Touche}"
            echo -en "\r${ReponsesTemp}" ;;

        " "|","|"")
            # Ajout des espaces
            ReponsesTemp+=" "
            echo -en "\r${ReponsesTemp}" ;;

        $'\177')
            # Retour en arriere
            ReponsesTemp=${ReponsesTemp::-1}
            echo -en "\r${ReponsesTemp} \b";;
    esac
done

Reponses=(${ReponsesTemp//$(LangText wait_text)})

#8 Re : -1 »  Quelques retours pour mon script ? » Le 19/08/2017, à 20:48

Hizoka
Réponses : 18

Ouais j'en suis là tongue

ReponsesTemp="$(LangText wait_text)"
TexteBase="${ReponsesTemp}"
Touche=" "
Clear=$(tput el)

echo -n "${ReponsesTemp}" >&2

until [[ -z ${Touche} ]]
do
    IFS= read -n 1 -s Touche # Travaille sur un seul caractere et cache les touches

    case "${Touche}" in
        [0-9])
            # Ajout des chiffres
            ReponsesTemp+="${Touche}"
            echo -en "\r${ReponsesTemp}" >&2 ;;

        "*")
            # Remplacement du contenu par le * avec un clear de la ligne
            ReponsesTemp="${TexteBase}*"
            echo -en "\r${Clear}${ReponsesTemp}" >&2 ;;

        " "|",")
            # Ajout des espaces
            ReponsesTemp+=" "
            echo -en "\r${ReponsesTemp}" >&2 ;;

        $'\012')
            # Saut de ligne
            echo -e "\r${ReponsesTemp}" >&2
            unset Touche ;;

        $'\033')
            # Touche echap avec un clear de la ligne
            echo -e "\r${Clear}${TexteBase}" >&2
            unset Touche ReponsesTemp ;;

        $'\177')
            # Retour en arriere
            ReponsesTemp=${ReponsesTemp::-1}
            [[ ${#TexteBase} -gt ${#ReponsesTemp} || "${ReponsesTemp}" == "${TexteBase}*" ]] && ReponsesTemp="${TexteBase}"
            echo -en "\r${ReponsesTemp} \b" >&2 ;;
    esac
done

# Saut de ligne esthetique
echo >&2

# Récupération des choix en supprimant le texte de base
[[ "${ReponsesTemp/#${TexteBase}}" == "*" ]] && Reponses=("*") || Reponses=(${ReponsesTemp/#${TexteBase}})

Il faut que je regle le soucis du * qui est converti en la liste des fichiers...

EDIT : Normalement c'est bon.
Je continue mes tests.

#9 Re : -1 »  Quelques retours pour mon script ? » Le 19/08/2017, à 22:42

Hizoka
Réponses : 18
Dernière version a écrit :

Les numéros commencent maintenant à 1
Ajout de l'argument --only-number pour ne renvoyer que les numeros
Le read ne prend en compte que les touches : tab , espace 0-9 * entrée
Mise en place de la complétion (automatique via le ppa ou le deb)

Pour la mise en place de la complétion manuellement :

sudo cp bash_completion /etc/bash_completion.d/multiselect
. /etc/bash_completion

et si la 2e commande ne suffit pas, redémarrer le terminal.

#10 Re : -1 »  Quelques retours pour mon script ? » Le 20/08/2017, à 10:23

Hizoka
Réponses : 18

D’ailleurs si tu veux aller plus loin, je devrais pas pouvoir taper 0 3 4 ... dans mon cas, et l'espace devrait être rajouté automatiquement si je tapes 1 ou 2. (ce qui me parait encore mieux que taper sans séparateur)

C'est exactement ce que j'avais en tête smile

multiselect vache ane

1) vache
2) ane

Sélection : 0

Ca fait suite au commencement des nombres à 0, je suis passé à coté.

multiselect vache ane

1) vache
2) ane

Sélection : 1 1
vache
vache

Je sais pas si je dois bloquer ça... ça peut avoir un interet non ?
ou alors passer via une option pour le bloquer ou non ?

multiselect vache ane

1) vache
2) ane

Sélection : *
/usr/bin/multiselect: ligne 472: * : erreur de syntaxe : opérande attendue (le symbole erroné est "*")

Il faut que je bloque l'étoile de read/echo si la l'option n'est pas active, bien vu.

multiselect vache ane

1) vache
2) ane

Sélection : * 1
grep: 68: Aucun fichier ou dossier de ce type
Erreur dans la sélection, il faut rentrer un/des chiffre(s) parmi ceux proposés.

Arf j'avais réglé ça mais j'ai du le supprimer depuis en me disant que ça servait à rien XD.

Merci pour ces tests.

#11 Re : -1 »  Quelques retours pour mon script ? » Le 20/08/2017, à 11:31

Hizoka
Réponses : 18

Mise à jour uniquement du fichier 7z pour le moment : http://hizo.fr/multiselect_v1.7z

Derniere version a écrit :

Insertion automatique des espaces pour les chiffres et nombres à 2 chiffres
Seuls les chiffres et nombres proposés peut être utilisés
Ajout d'une vérification du texte d'attente afin que le dernier caractère ne soit pas un chiffre, ajoute un espace si besoin
Ajout d'une vérification sur les valeurs par défaut

Je veux voir ça :
Amélioré le read pour qu'il teste les nombres à 3 chiffres.
Ajouter la possibilité d’écrire en colonne ? Histoire que ça prenne moins de place.
Ajouter l'argument --uniq pour éviter les réponses doublons

J'ai eu un souci avec la complétion, ça sera régler sur la prochaine version du ppa.

#12 Re : -1 »  Script bash pour vérifier nommage fichier et mette condition » Le 17/08/2017, à 17:48

Hizoka
Réponses : 9

Salut,

si tu te mets dans le dossier à traiter :

for Fichier in *
do
  # teste le nom du fichier
  if [[ $(grep "_[0-9]{2}_[0-9]{2}_[0-9]{4}" <<< "${Fichier}") ]]
  then
    # recherche du mot
    if [[ $(grep "TonMot" "${Fichier}") ]]
    then
      echo "Deplacement du fichier ${Fichier} vers Destination"
      #mv "${Fichier}" Destination
    else
     echo "Le fichier ${Fichier} ne contient pas TonMot"
    fi
  else
   echo "Le fichier ${Fichier} n'est pas nommé comme il faut."
  fi
done

si ca te va tu vires le #.

il faut donc que tu remplaces TonMot et Destination par leur valeur.

#13 Re : -1 »  Script bash pour vérifier nommage fichier et mette condition » Le 17/08/2017, à 18:37

Hizoka
Réponses : 9

Je me disais aussi que j'avais raté un truc là XD

#14 Re : -1 »  Script bash pour vérifier nommage fichier et mette condition » Le 17/08/2017, à 22:41

Hizoka
Réponses : 9

Oups, en effet, c'est egrep smile
j'ai réécrit trop rapidement.

je sais que ça peut être simplifié mais j'aime pas cette écriture tongue

#15 Re : -1 »  [Résolu mais dangereux] Renvoyer un tableau depuis une commande » Le 16/08/2017, à 23:10

Hizoka
Réponses : 25

On m'a proposé une solution qui va pas plaire à Watael XD

titi() { echo "[0]='oui' [5]='non'" ;}

eval x=($(titi))

echo ${x[@]}
oui non

echo ${!x[@]}
0 5

J'avais pensé à eval à un moment mais mon subconscient ma dit : eval, c'est mal !
comme quoi à force de répéter ça rentre... tongue

#16 Re : -1 »  [Résolu mais dangereux] Renvoyer un tableau depuis une commande » Le 17/08/2017, à 09:21

Hizoka
Réponses : 25

Salut,
j'ai pas tout pigé pour le coup, je maîtrise pas les declares et les shifts.
Peux tu apporter une petite explication ?
Sinon ça semble fonctionner en effet smile

mycommand () {
    local _table_obj="${1}" # Mais pourquoi est-il en local et à quoi ça sert ?
    shift
    declare -n _p=${_table_obj} # Lien vers _table_obj

    declare -g _p[8]="valeur 8" # Declaration en mode global
    shift
    declare -g _p[12]="valeur 12" # Declaration en mode global
    shift
    declare -g _p[2]="valeur 2" # Declaration en mode global
    shift
}

#17 Re : -1 »  [Résolu mais dangereux] Renvoyer un tableau depuis une commande » Le 17/08/2017, à 13:59

Hizoka
Réponses : 25

Ca me parle plus comme ça pour comprendre smile

En effet c'est sympa.

mycommand () {
    declare -n _p="${1}"
    _p[8]="valeur 8"
    _p[12]="valeur 12"
    _p[2]="valeur 2"
}

declare -Ag table_obj="matable"

mycommand matable
echo ${matable[@]}
echo ${!matable[@]}
echo ${#matable[@]}

Mais pour que ça fonctionne comme une commande "normale", on en arrive qu'il faut sourcer le fichier.

. mycommand matable

Dans tous les cas, merci pour ces connaissances smile

#18 Re : -1 »  [Résolu mais dangereux] Renvoyer un tableau depuis une commande » Le 17/08/2017, à 22:40

Hizoka
Réponses : 25

A la base le but c'est que cela fonctionne depuis un fichier externe et non depuis une fonction.

#19 -1 »  [Résolu] Rechercher un élément exacte » Le 16/08/2017, à 18:28

Hizoka
Réponses : 7

Bonjour à vous smile

Je me posais une question, comment simplifier ceci :

for x in "${liste[@]}"
do
    [[ ${x} == Exit ]] && return
done

J'ai pensé à :

grep -w "Exit" <<< "${liste[@]}" && return

mais il suffirait qu'il y ait un élément de la liste qui commence par Exit pour que ça plante le truc.

Avez vous une autre idée ?

Merci.

#20 Re : -1 »  [Résolu] Rechercher un élément exacte » Le 16/08/2017, à 19:02

Hizoka
Réponses : 7

Je veux chercher un élément exacte dans la liste.

J'aimerai justement tout tester d'un coup pour eviter toutes ces lignes.

je viens de penser à ça mais pas tip top :

x="${liste[@]/#/\"}" x="${x[@]/%/\"}"
grep -w '"Exit"' <<< "${x[@]}" && return

ou plus simplement

grep -w "Exit:)" <<< "${liste[@]/%/:)}" && return

en toute logique seul un élément dont le texte est Exit devrait s’appeler Exit:) non ?

#22 Re : -1 »  [Résolu] Rechercher un élément exacte » Le 16/08/2017, à 22:44

Hizoka
Réponses : 7

Oui et elle me plait bien, elle est facilement lisible.

On m'a egalement proposé :

searchArray () { ar=( exit fin 'exit ing' fine send ); rgx="^$(IFS='|'; echo "${ar[*]}")$"; [[ $1 =~ $rgx ]] && printf '%s\n' "${BASH_REMATCH}"; }

ou plus simplement :

egrep "^ ?Exit$" <<< "${liste[@]/%/$'\n'}"

qui est bien plus proche de mon idée de base.

#23 Re : -1 »  [RESOLU] Ouvrir une page web à un moment précis » Le 16/08/2017, à 12:16

Hizoka
Réponses : 5

Salut, utilise cron : https://doc.ubuntu-fr.org/cron
et pense à lui indiquer DISPLAY=:0 pour l'interface graphique

#24 Re : -1 »  [RESOLU] Ouvrir une page web à un moment précis » Le 16/08/2017, à 20:32

Hizoka
Réponses : 5

Le DISPLAY permet d'indiquer l'écran à utiliser.