2017-07-28 1 views
1

J'ai un fichier plat appelé éléments que je veux remplir un select mais je veux être en mesure de choisir plusieurs éléments à la fois.bash sélectionner plusieurs réponses à la fois

contenu des articles fichier:

cat 1 
dog 1 
pig 1 
cherry 2 
apple 2 

script Basic:

#!/bin/bash 
PS3=$'\n\nSelect the animals you like: ' 
options=$(grep '1' items|grep -v '^#' |awk '{ print $1 }') 

select choice in $options 
do 
    echo "you selected: $choice" 
done 

exit 0 

La façon dont il coule est maintenant, je ne peux sélectionner une option à au moment. Je voudrais être en mesure de répondre à 1,3 ou 1 3 et avoir répondu « vous avez sélectionné: cochon de chat »

Merci,

Tazmarine

+0

Je dirais qu'il est impossible de faire cela avec 'select'. –

Répondre

0

Voici ce que j'ai trouvé. Cela semble fonctionner comme je veux. Je veux que la sortie finale soit séparée par des virgules:

#!/bin/bash 

newarray=(all $(grep '1' items|grep -v '^#' |awk '{ print $1 }')) 

options() { 
num=0 
for i in ${newarray[@]}; do 
    echo "$num) $i" 
    ((num++)) 
done 
} 

getanimal() { 
while [[ "$show_clean" =~ [A-Za-z] || -z "$show_clean" ]]; do 
    echo "What animal do you like: " 
    options 
    read -p 'Enter number: ' show 
    echo 
    show_clean=$(echo $show|sed 's/[,.:;]/ /g') 
    selected=$(\ 
    for s in $show_clean; do 
    echo -n "\${newarray[${s}]}," 
    done) 
    selected_clean=$(echo $selected|sed 's/,$//') 
done 
eval echo "You selected $selected_clean" 
} 

getanimal 

exit 0 
1

Vous ne pouvez pas le faire en tant que telle, mais vous pouvez toujours enregistrer chaque sélection individuelle:

#!/bin/bash 
PS3=$'\n\nSelect the animals you like: ' 
options=$(grep '1' items|grep -v '^#' |awk '{ print $1 }') 

# Array for storing the user's choices 
choices=() 

select choice in $options Finished 
do 
    # Stop choosing on this option 
    [[ $choice = Finished ]] && break 
    # Append the choice to the array 
    choices+=("$choice") 
    echo "$choice, got it. Any others?" 
done 

# Write out each choice 
printf "You selected the following: " 
for choice in "${choices[@]}" 
do 
    printf "%s " "$choice" 
done 
printf '\n' 

exit 0 

est ici une interaction exemple:

$ ./myscript 
1) cat 
2) dog 
3) pig 
4) Finished 

Select the animals you like: 3 
pig, got it. Any others? 

Select the animals you like: 1 
cat, got it. Any others? 

Select the animals you like: 4 
You selected the following: pig cat 

Si vous voulez plutôt pouvoir écrire 3 1 sur la même ligne, vous devrez faire votre propre boucle de menu avec echo et read

+0

Merci pour le conseil. Je veux la possibilité d'utiliser 1 3 4 7 ou 1,3,4,7 ou même 1: 3: 4: 7. Certaines listes peuvent contenir plus de 80 éléments, il n'est donc pas préférable de les sélectionner une à la fois. Je vais devoir y réfléchir et poster quelques options. Étant donné que la liste des éléments peut varier, je suppose que je vais d'abord besoin de définir des variables pour les nombres, puis un moyen d'analyser. Je vais mettre à jour ce post mardi avec ce que je viens avec. Je vous remercie. – tazmarine