كيف يمكنني الوصول إلى المتغيرات التي يتم تسمية بالتسلسل حلقة في حين لا يزال داخل حلقة؟
سؤال
وأنا أحاول أن أفهم إذا كان من الممكن لإنشاء مجموعة من المتغيرات التي يتم ترقيم على أساس متغير آخر (باستخدام وحدة التقييم) في حلقة، ثم يدعو عليه قبل انتهاء الحلقة.
وكمثال على ذلك قمت بكتابة السيناريو تسمى مسألة (الأمر قبضة هو إظهار ما هو محتويات علامة التبويب $ متغير)
(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
وبعض إصدارات قذيفة تسمح لك أيضا استخدام $ {!} فار مرجع غير مباشر المتغيرات