Comment sélectionner des valeurs de tableau uniques?

J'ai un tableau et je veux get les deuxièmes membres uniques

bash n'a pas vraiment de tableau bidimensionnel donc je l'ai défini de cette façon, en utilisant :: comme séparateur des deux éléments:

 ruby_versions=( 'company-contacts::1.7.4' 'activerecord-boolean-converter::1.7.4' 'zipcar-rails-core::1.7.4' 'async-tasks::1.7.13' 'zc-pooling-client::2.1.1' 'reservations-api::1.7.4' 'zipcar-auth-gem::1.7.4' 'members-api::1.7.4' 'authentication-service::1.7.4' 'pooling-api::2.1.1' ) 

Je peux itérer avec succès à travers les 2èmes éléments du tableau avec:

 rvm list > $TOP_DIR/local_ruby_versions.txt for repo in "${ruby_versions[@]}" do if grep -q "${repo##*::}" $TOP_DIR/local_ruby_versions.txt then echo "ruby version ${repo##*::} confirmed as present on this machine" else rvm list echo "*** EXITING SMOKE TEST *** - not all required ruby versions are present in RVM" echo "Please install RVM ruby version: ${repo##*::} and then re-run this program" exit 0 fi done echo "A 

Le seul inconvénient est qu'il répète l'action quand la version ruby ​​est la même (ce qui est généralement le cas), donc je reçois

 ruby version 1.7.4 confirmed as present on this machine ruby version 1.7.4 confirmed as present on this machine ruby version 1.7.4 confirmed as present on this machine ruby version 1.7.13 confirmed as present on this machine ruby version 2.1.1 confirmed as present on this machine ruby version 1.7.4 confirmed as present on this machine ruby version 1.7.4 confirmed as present on this machine ruby version 1.7.4 confirmed as present on this machine ruby version 1.7.4 confirmed as present on this machine ruby version 2.1.1 confirmed as present on this machine 

quand j'ai

 ruby_versions=( 'company-contacts::1.7.4' 'activerecord-boolean-converter::1.7.4' 'zipcar-rails-core::1.7.4' 'async-tasks::1.7.13' 'zc-pooling-client::2.1.1' 'reservations-api::1.7.4' 'zipcar-auth-gem::1.7.4' 'members-api::1.7.4' 'authentication-service::1.7.4' 'pooling-api::2.1.1' 

)

Comment puis-je le faire de sorte qu'il ne fait qu'une fois le chèque pour les versions 1.7.4 et 2.1.1?

ie Comment puis-je transformer ma sélection de tableau en (1.7.4 2.1.1)

Les noms de repo réels peuvent être ignorés dans ce context.

Vous pourriez utiliser un tableau associatif:

 declare -A versions for value in "${ruby_versions[@]}"; do versions["${value##*::}"]=1 done printf "%s\n" "${!versions[@]}" 
 1.7.4 1.7.13 2.1.1 

Ou avec un pipeline:

 mapfile -t versions < <(printf "%s\n" "${ruby_versions[@]}" | sed 's/.*:://' | sort -u) printf "%s\n" "${versions[@]}" 
 1.7.13 1.7.4 2.1.1 
 echo "${ruby_versions[@]}" | sed 's/\S\+:://g;s/\s\+/\n/g'| sort -u 

les sorties:

 1.7.13 1.7.4 2.1.1 

Ou si vous voulez bash builtins

 unset u for i in "${ruby_versions[@]}" do if [[ ! $u =~ ${i##*::} ]] then u=${u:+$u\\n}${i##*::} fi done echo -e "$u"