2017-10-19 5 views
1

以下のような値を持つbash配列 "RUN_Arr"があります。値が同じであれば、スクリプトをもう一度続けて、報告したいと思います。上記の配列に基づいてbash配列の値がすべて同じかどうかを確認してください

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

、私はエコーしたい:

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

誰かが解決策を提案することはできますか?ありがとう。 透かしに対する

答えて

5

あなたの配列を反復処理、およびテスト:

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 ..." 

あなたのための概念実証の非常に単純化しました。あなたの目的に応じて明らかに強化してください。

+0

ご回答のおかげで、私は同じアプローチを考えていました。私は、配列内にユニークな要素を取得する関数がある場合、ユニークな要素の数が複数の場合は報告できますかと思います。 –

+0

それ自体はそのような機能はありませんが、それは自分で書くことができなかったわけではありません。私はAwkを使うか、別の言語にアウトソースするか、またはBashのハッシュテーブルを使うかもしれません。 [Bashでハッシュテーブルを定義する方法はこちら](https://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash) – hunteke

2

あなたの配列要素のどれも改行文字が含まれていない場合は、あなたがこれを行うことができます:あなたは改行文字を持つ要素から保護するために必要がある場合は、bashの4.4を持っている場合

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

を、簡単な解決策がある(のための-dオプション)と-zオプションのヌーやFreeBSDの並べ替え():

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 

はbashの4.4がなければ、あなたは@ 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 

(これはまだ-zをサポートして並べ替えが必要です。)

+0

Riciありがとうございました。 –

関連する問題