2017-10-19 54 views
1

J'ai un tableau bash "RUN_Arr" avec les valeurs indiquées ci-dessous. Si les valeurs sont identiques, je veux que le script continue, sinon je veux les signaler.Vérifiez si les valeurs du tableau de bash sont toutes identiques

echo "${RUN_Arr[@]}" 
"AHVY37BCXY" "AHVY37BCXY" "AHVY37BCXY" "AHVY38BCXY" "AHVY37BCXY" "AHVY37BCXY" 

Basé sur le tableau ci-dessus, je veux faire écho:

No the array values are not same 
"AHVY37BCXY" "AHVY38BCXY" 

Quelqu'un peut-il proposer une solution? Merci.

Répondre

5

dans votre tableau Itérer, et un test contre un filigrane:

arr=(a a a b a a a) 

watermark=${arr[0]} 
for i in "${arr[@]}"; do 
    if [[ "$watermark" != "$i" ]]; then 
     not_equal=true 
     break 
    fi 
done 

[[ -n "$not_equal" ]] && echo "They are not equal ..." 

Très simpliste Proof-Of-Concept pour vous; évidemment durcir comme approprié pour vos fins.

+0

Merci pour votre réponse, je pensais la même approche. Je me demande s'il existe une fonction qui obtient l'élément unique dans un tableau si c'est le cas, je peux signaler si le nombre d'éléments uniques est supérieur à un. –

+0

Il n'y a pas de telle fonction en soi, mais cela ne signifie pas que vous ne pouvez pas en écrire une pour vous-même. Je pourrais utiliser Awk, externaliser dans une langue différente, ou les tables de hachage de Bash. Découvrez [Comment définir les tables de hachage dans Bash?] (Https://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash) – hunteke

2

Si aucun de vos éléments du tableau comprend un caractère de nouvelle ligne, vous pouvez le faire:

mapfile -t uniq < <(printf "%s\n" "${RUN_Arr[@]}" | sort -u) 
if ((${#uniq[@]} > 1)); then 
    echo "The elements are not the same: ${uniq[@]}" 
    # ... 

Si vous devez protéger contre les éléments avec des caractères de nouvelle ligne, il y a une solution simple si vous avez bash 4.4 (pour l'option -d) et trier Gnu ou FreeBSD (pour l'option -z):

mapfile -d '' -t uniq < <(printf "%s\n" "${RUN_Arr[@]}" | sort -zu) 
if ((${#uniq[@]} > 1)); then 
    echo "The elements are not the same: ${uniq[@]}" 
    exit 1 
fi 

Sans bash 4.4, vous pouvez utiliser une adaptation de la réponse de @ hunteke:

for i in "${RUN_Arr[@]:1}"; do 
    if [[ $i != ${RUN_ARR[0]} ]]; then 
     printf "The elements are not the same:" 
     printf "%s\0" "${RUN_Arr[@]}" | 
      sort -zu | 
      xargs -0 printf " %s" 
     printf "\n" 
     exit 1 
    fi 
done 

(Cela nécessite encore une sorte qui soutient -z.)

+0

Merci Rici, c'est très utile. –