كيف يمكنني الوصول إلى المتغيرات التي يتم تسمية بالتسلسل حلقة في حين لا يزال داخل حلقة؟

StackOverflow https://stackoverflow.com/questions/1030532

  •  06-07-2019
  •  | 
  •  

سؤال

وأنا أحاول أن أفهم إذا كان من الممكن لإنشاء مجموعة من المتغيرات التي يتم ترقيم على أساس متغير آخر (باستخدام وحدة التقييم) في حلقة، ثم يدعو عليه قبل انتهاء الحلقة.

وكمثال على ذلك قمت بكتابة السيناريو تسمى مسألة (الأمر قبضة هو إظهار ما هو محتويات علامة التبويب $ متغير)

(23:32:12\[deco@S.Man)
[~/bin]$ listQpsk 40|grep -w [1-4]
40 SMANHUBAQPSK1          1    1344      1195        88
40 SMANHUBAQPSK1          2    1668      1470        88
40 SMANHUBAQPSK1          3    1881      1539        81
40 SMANHUBAQPSK1          4    1686      1409        83


(23:18:42\[deco@S.Man)
[~/bin]$ cat question
#!/usr/bin/bash
tab=`listQpsk 40|grep -w [1-4]`
seq=1
num=4
until [[ $seq -gt $num ]];do
eval count$seq=`echo "$tab"|grep -w $seq|awk '{print $5}'`
seq=$(($seq+1))
done
echo $count1
echo $count2
echo $count3
echo $count4

عند تشغيل هذه أحصل

(23:32:23\[deco@S.Man)
[~/bin]$ ./question 
1195
1471
1538
1409

ما هو بالضبط ما أتوقع، ولكن هناك وسيلة لنقل الأوامر صدى داخل حتى حلقة بحيث جزءا من حلقة تتردد أصداء قيمة المتغير الذي تم إنشاؤه للتو. شيء من هذا القبيل:

until [[ $seq -gt $num ]];do
eval count$seq=`echo "$tab"|grep -w $seq|awk '{print $5}'`
seq=$(($seq+1))
echo "$count$seq"
done

وPS: آسف إذا كان التنسيق بلدي هو خارج ... أول مرة نشر هنا، وأنا أعرف فقط تخفيض السعر من رديت

هل كانت مفيدة؟

المحلول

استخدام المراوغة:

until [[ $seq -gt $num ]];do
    var="count$seq"
    eval $var=$(echo "$tab"|awk -v seq=$seq '$3==seq {print $5}') # awk loves to do grep's job
    let seq+=1    # another way
    echo "${!var}"    # indirection
done

لا حاجة لوحدة التقييم آخر.

نصائح أخرى

وليس الإجابة على سؤالك بالضبط، ولكن ... هل تعلم باش ديه متغيرات المصفوفة؟

seq=1
num=4
until [[ $seq -gt $num ]];do
count[$seq]=`echo "$tab"|grep -w $seq|awk '{print $5}'`
seq=$(($seq+1))
done
echo ${count[*]}

وأو دون صفائف:

seq=1
num=4
until [[ $seq -gt $num ]];do
eval count$seq=`echo "$tab"|grep -w $seq|awk '{print $5}'`
eval echo \$count$seq
seq=$(($seq+1))
done

نعم، مثل هذا (في باش على الأقل):

$ count1=xyz
$ seq=1
$ value=`eval echo \$\{count$seq\}`
$ echo $value

وجرب هذا:

varName=a
for i in 1 2 3
do
   eval $varName$i=stuff
   eval var=\$$varName$i
   echo $var
done

وبعض إصدارات قذيفة تسمح لك أيضا استخدام $ {!} فار مرجع غير مباشر المتغيرات

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top