অ্যারে উপাদানগুলিতে বাশগুলিতে সমস্ত সমান হলে কীভাবে পরীক্ষা করবেন?


15

নিম্নলিখিত লিঙ্কগুলি প্রতিটি লিনাক্স মেশিনে ডিস্কের সংখ্যা উপস্থাপন করে

প্রতিটি একক অ্যারেতে একটি লিনাক্স মেশিনে ডিস্কের সংখ্যা অন্তর্ভুক্ত রয়েছে ।

echo ${ARRAY_DISK_Quantity[*]}
4 4 4 4 2 4 4 4

সমস্ত অ্যারের মান সমান হয় তা চিহ্নিত করার সহজ উপায় কী?

ভাল অবস্থা:

4 4 4 4 4 4 4 4

খারাপ অবস্থা:

4 4 4 4 4 4 2 4

খারাপ অবস্থা:

6 6 6 6 6 6 6 6 6 6 2 6 2

এত উত্তর এবং ভোট নেই?
jesse_b

এটি কি কেবল পূর্ণসংখ্যা পরীক্ষা করবে বা এটি স্ট্রিংগুলিও পরীক্ষা করবে?
jesse_b

আমি সবেমাত্র উত্তরের উত্তরের জন্য অপেক্ষা করছি খুব শীঘ্রই আমি ভোট দেব
yael

আমি সবাইকে বোঝাতে চাইছি। এই প্রশ্নটি upovote আইএমও প্রাপ্য।
jesse_b

কমপক্ষে এই স্তরের জটিলতার কোনও
প্রদর্শনীর নাম

উত্তর:


11

bash+ জিএনইউ sort+ জিএনইউ grepসমাধান:

if [ "${#array[@]}" -gt 0 ] && [ $(printf "%s\000" "${array[@]}" | 
       LC_ALL=C sort -z -u |
       grep -z -c .) -eq 1 ] ; then
  echo ok
else
  echo bad
fi

ইংরাজির ব্যাখ্যা: অ্যারের উপাদানগুলিকে যদি অনন্য বাছাই করে তবে কেবল একটি উপাদান থাকে, তারপরে "ঠিক আছে" মুদ্রণ করুন। অন্যথায় "খারাপ" মুদ্রণ করুন।

অ্যারে NUL প্রতিটি উপাদান পৃথক বাইট সঙ্গে ছাপা হয়, সাজানোর গনুহ মধ্যে পাইপ (উপর নির্ভর -zওরফে --zero-terminatedএবং -uওরফে --uniqueঅপশন), এবং তারপর মধ্যে grep(বিকল্পগুলি ব্যবহার -zওরফে --null-dataএবং -cওরফে --count) আউটপুট লাইন গণনা।

আমার আগের সংস্করণটির বিপরীতে, আমি wcএখানে ব্যবহার করতে পারছি না কারণ এটির জন্য একটি নতুন লাইন দিয়ে সমাপ্ত ইনপুট লাইনগুলি দরকার ... এবং এনইউএল বিভাজকগুলি ব্যবহারের উদ্দেশ্যকে পরাস্ত করার পরে NUL ব্যবহার করে sedবা trনতুন লাইনে রূপান্তর করতে পারে sortgrep -cএকটি যুক্তিসঙ্গত বিকল্প তোলে।


এখানে একই জিনিসটি ফাংশন হিসাবে আবারও লেখা হয়েছে:

function count_unique() {
  local LC_ALL=C

  if [ "$#" -eq 0 ] ; then 
    echo 0
  else
    echo "$(printf "%s\000" "$@" |
              sort --zero-terminated --unique |
              grep --null-data --count .)"
  fi
}



ARRAY_DISK_Quantity=(4 4 4 4 2 4 4 4)

if [ "$(count_unique "${ARRAY_DISK_Quantity[@]}")" -eq 1 ] ; then
  echo "ok"
else
  echo "bad"
fi

1
নোট করুন যে sort -uঅনন্য উপাদানগুলি দেয় না তবে উপাদানগুলির প্রতিটি সেটগুলির মধ্যে একটি যা একইভাবে সাজায়। উদাহরণস্বরূপ, এটি ARRAY_DISK_Quantity=(① ②)একটি জিএনইউ সিস্টেমে "ঠিক আছে" বলবে যেখানে লোকালগুলি সাধারণত সেই 2 টি অক্ষরকে একইভাবে সাজান। আপনি LC_ALL=C sort -uবাই-টু-বাইট স্বতন্ত্রতার জন্য চাই ।
স্টাফেন চেজেলাস

শুধু অন্য নোটটি সিএলআই থেকে কোনও অতিরিক্ত ডিস্ক উপস্থিত না হওয়ার ক্ষেত্রে এটি ব্যর্থ হবে তাই এই সিনট্যাক্স যুক্ত করারও দরকার আছে
yael

[[`প্রিন্টফ"% s \ n "" $ {এআরএআর_ডিস্ক_কুনটি [@]} "| wc -l e -eq `printf"% s \ n "" $ R আরআর_ডিস্ক_কুনটি [@]} "| গ্রেপ-সি "0" `]] & & প্রতিধ্বনি ব্যর্থ
ইয়ায়েল

আইএফএস ইস্যু অনুসারে @ স্টাফেনচাজেলা লোকাল ইস্যুটি মোকাবেলা করার মতো মূল্যবান। একটি খালি তালিকার জন্য পরীক্ষা করা, আইএমও, আলাদাভাবে আলাদাভাবে করা হয় - খালি সেটে অ-অনন্য উপাদানগুলির জন্য পরীক্ষা করার দরকার নেই।
ক্যাস

হাই ক্যাস আমি আপনার আগের উত্তরটি পছন্দ করি
yael

8

সহ zsh:

if ((${#${(u)ARRAY_DISK_Quantity[@]}} == 1)); then
  echo OK
else
  echo not OK
fi

যেখানে অনন্য মানগুলি (u)প্রসারিত করতে একটি প্যারামিটার সম্প্রসারণ পতাকা রয়েছে । সুতরাং আমরা অ্যারে অনন্য মান একটি গণনা পেয়ে যাচ্ছি।

আপনি খালি অ্যারে ঠিক আছে তা বিবেচনা করতে চান তা == 1দিয়ে প্রতিস্থাপন করুন <= 1

এর সাহায্যে ksh93আপনি অ্যারে বাছাই করতে পারেন এবং পরীক্ষা করতে পারেন যে প্রথম উপাদানটি শেষের মতো:

set -s -- "${ARRAY_DISK_Quantity[@]}"
if [ "$1" = "${@: -1}" ]; then
  echo OK
else
  echo not OK
fi

Ksh88 বা pdksh / mksh সহ:

set -s -- "${ARRAY_DISK_Quantity[@]}"
if eval '[ "$1" = "${'"$#"'}" ]'; then
  echo OK
else
  echo not OK
fi

সাথে bash, আপনার সম্ভবত একটি লুপ দরকার:

unique_values() {
  typeset i
  for i do
    [ "$1" = "$i" ] || return 1
  done
  return 0
}
if unique_values "${ARRAY_DISK_Quantity[@]}"; then
  echo OK
else
  echo not OK
fi

(অ্যারে সাপোর্ট (Ksh, zsh, বাশ, যশ) সহ বোর্নের মতো সমস্ত শেল নিয়ে কাজ করবে)।

মনে রাখবেন যে এটি খালি অ্যারের জন্য ঠিক আছে। [ "$#" -gt 0 ] || returnআপনি যদি না চান তবে ফাংশনটির শুরুতে একটি যুক্ত করুন ।


এই সমস্ত উত্তর বাশ সমর্থন করে না বলে মনে হচ্ছে?
ইয়েল

@ আইয়েল, বাশ সমাধানের জন্য সম্পাদনা দেখুন। তবে আপনি কেন ব্যবহার করবেন bash?
স্টাফেন চেজেলাস

ব্যাশ সালে সাহায্যের পৃষ্ঠার জন্য typesetবলছেন Obsolete. See `help declare'.একটি কারণ আপনি পরিবর্তে এটি ব্যবহার করছি localবা declare?
wjandrea

1
@wjandrea typesetএক যে সব 4 শাঁস কাজ করে। এছাড়া এর মূল গোড়ার দিকে 80s মধ্যে ksh থেকে এক (ব্যাশ বেশিরভাগই কপি ksh88 যখন এটি পরিবর্তনশীল scoping টাইপ সেটিং এবং ঘোষণা আসে কিন্তু নামান্তর করার সিদ্ধান্ত নিয়েছে typeset declareএবং করতে typesetডিক্লেয়ার উপনাম)।
স্টাফেন চেজেলাস

4

bash+ + awkSoltion:

function get_status() {
    arr=("$@")    # get the array passed as argument
    if awk 'v && $1!=v{ exit 1 }{ v=$1 }' <(printf "%d\n" "${arr[@]}"); then 
        echo "status: Ok"
    else 
        echo "status: Bad"
    fi
}

পরীক্ষার কেস # 1:

ARRAY_DISK_Quantity=(4 4 4 4 4 2 4 4)
get_status "${ARRAY_DISK_Quantity[@]}"
status: Bad

পরীক্ষার কেস # 2:

ARRAY_DISK_Quantity=(4 4 4 4 4 4 4 4)
get_status "${ARRAY_DISK_Quantity[@]}"
status: Ok

4

আমার কাছে আরও একটি বাশ সমাধান রয়েছে যা স্ট্রিংগুলির সাথেও কাজ করা উচিত:

isarray.equal () {
    local placeholder="$1"
    local num=0
    while (( $# )); do
        if [[ "$1" != "$placeholder" ]]; then
            num=1
            echo 'Bad' && break
        fi
        shift
    done
    [[ "$num" -ne 1 ]] && echo 'Okay'
}

প্রদর্শন:

[root@JBSTEST001 ~]# ARRAY_DISK_Quantity=(4 4 4 4 2 4 4 4)
[root@JBSTEST001 ~]# isarray.equal "${ARRAY_DISK_Quantity[@]}"
Bad
[root@JBSTEST001 ~]# ARRAY_DISK_Quantity=(4 4 4 4 4 4 4 4)
[root@JBSTEST001 ~]# isarray.equal "${ARRAY_DISK_Quantity[@]}"
Okay
[root@JBSTEST001 ~]# ARRAY_DISK_Quantity=(four four four four two four four four)
[root@JBSTEST001 ~]# isarray.equal "${ARRAY_DISK_Quantity[@]}"
Bad
[root@JBSTEST001 ~]# ARRAY_DISK_Quantity=(four four four four four four four four)
[root@JBSTEST001 ~]# isarray.equal "${ARRAY_DISK_Quantity[@]}"
Okay

মনে রাখবেন যে ফটোগুলির নামে বিন্দুগুলি বৈধ নয়, যদিও বাশ বেশ অনুমোদিত pretty এটি ফাংশন রফতানির মতো সমস্যার কারণ হতে পারে।
wjandrea


2

বাশ এবং জিএনইউ গ্রেপ সহ:

if grep -qE '^([0-9]+)( \1)*$' <<< "${ARRAY_DISK_Quantity[@]}"; then 
  echo "okay"
else
  echo "not okay"
fi

হ্যাঁ, তবে কি (10 10 10 10)? অন্যথায়, বেশ সুন্দর।
জো

@ জো: ভাল ধরা। আমি আমার উত্তর আপডেট করেছি।
সাইরাস


0

বাশ শুধুমাত্র সমাধান (অনুমান করা aহয় ARRAY_DISK_Quantity)

ttt=${a[0]}
res=0
for i in "${a[@]}"
do 
    let res+=$(if [ "$ttt" -ne "$i" ]; then echo 1; else echo 0; fi);  
done
if [ "$res" -eq 0 ]
then 
    echo "ok"
else
    echo "bad"
fi

কাজ করে, তবে একটি মাত্র পর্যাপ্ত হলে সমস্ত ত্রুটি গণনা করে:if [ "$ttt" -ne "$i" ]; then res=1; break; fi;
জো

0

প্রতিটি অ্যারে উপাদানকে পরের সাথে তুলনা করতে লুপের জন্য একটি ব্যবহার করুন। শেষের উপাদানটির শেষের সাথে কোনও কিছুর সাথে তুলনা করা এড়াতে অ্যারের দৈর্ঘ্যের চেয়ে লুপের এক পুনরাবৃত্তিটি শেষ করুন।

for (( i=0; i<((${#array[@]}-1)); i++ )); do
    [ "${array[$i]}" != "${array[(($i+1))]}" ] && echo "Mismatch"
done
echo "Match"

U&L এ আপনাকে স্বাগতম এবং আপনার অবদানের জন্য আপনাকে ধন্যবাদ! এই কোডটি "মিল" মুদ্রণ করবে এমনকি কোনও মিল না পাওয়া গেলেও ... এটি কি উদ্দেশ্য?
ফ্রে-সান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.