إذا كنت تستخدم صدفة NIX "القياسية" * ، فقد لا تكون على دراية بميزة bash المفيدة للمصفوفات. في حين أن المصفوفات في bash ليست رائعة كما هي في لغات P (Perl و Python و PHP) ولغات البرمجة الأخرى ، إلا أنها غالبًا ما تكون مفيدة.
تحتوي مصفوفات Bash على مؤشرات رقمية فقط ، لكنها اختيارية ، مما يعني أنك لست مضطرًا إلى تحديد قيم جميع المؤشرات بشكل صريح. يمكن تعريف مصفوفة كاملة بإحاطة المدخلات بأقواس:
arr=(Hello World)
يمكن تعريف السجلات الفردية باستخدام الصيغة المألوفة (من BASIC (Dijkstra Forgive me - ملاحظة المترجم) إلى Fortran):
arr[0]=Hello
arr[1]=World
ومع ذلك ، فإن العكس يبدو أكثر بشاعة نسبيا. إذا كنت بحاجة للإشارة إلى إدخال معين ، فحينئذٍ:
echo ${arr[0]} ${arr[1]}
من صفحة الدليل:
" هناك حاجة إلى الأقواس المتعرجة لمنع التعارضات عند توسيع المسارات الكاملة للملفات. "
بالإضافة إلى ذلك ، تتوفر التركيبات الغريبة التالية:
${arr[*]} #
${!arr[*]}#
${#arr[*]}#
${#arr[0]}# ( )
$ {! arr [*]} إضافة جديدة نسبيًا إلى bash وليست جزءًا من التطبيق الأصلي. يوضح البناء التالي مثالاً على الاستخدام البسيط للمصفوفة. لاحظ أن "[index] = value" ، وهذا يسمح لك بتعيين قيمة محددة لرقم سجل معين.
#!/bin/bash
array=(one two three four [5]=five)
echo "Array size: ${#array[*]}" #
echo "Array items:" #
for item in ${array[*]}
do
printf " %s\n" $item
done
echo "Array indexes:" #
for index in ${!array[*]}
do
printf " %d\n" $index
done
echo "Array items and indexes:" #
for index in ${!array[*]}
do
printf "%4d: %s\n" $index ${array[$index]}
done
سيؤدي تشغيل البرنامج النصي إلى إنشاء الإخراج التالي:
حجم الصفيف: 5
عناصر الصفيف:
واحد
اثنان
ثلاثة
أربعة
خمسة
فهارس صفيف:
0
1
2
3
5
عناصر وفهارس الصفيف:
0: واحد
1: اثنان
2: ثلاثة
3: أربعة
5: خمسة
لاحظ ذلك يمكن استخدام الحرف "@" بدلاً من "*" في تركيبات مثل {arr [*]} ، ستكون النتيجة هي نفسها باستثناء توسيع الإدخال المقتبس. سيعرض "$ *" و "$ @" الإدخالات المقتبسة ، وسيعرض "$ {arr [*]}" كل إدخال ككلمة واحدة ، ويعيد "$ {arr [@]}" كل إدخال ككلمات منفصلة.
سيوضح المثال التالي كيف تُرجع علامات الاقتباس والبناء غير المقتبس سلاسل (مهم بشكل خاص عندما تحتوي هذه السلاسل على مسافات):
#!/bin/bash
array=("first item" "second item" "third" "item")
echo "Number of items in original array: ${#array[*]}"
for ix in ${!array[*]}
do
printf " %s\n" "${array[$ix]}"
done
echo
arr=(${array[*]})
echo "After unquoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
printf " %s\n" "${arr[$ix]}"
done
echo
arr=("${array[*]}")
echo "After * quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
printf " %s\n" "${arr[$ix]}"
done
echo
arr=("${array[@]}")
echo "After @ quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
printf " %s\n" "${arr[$ix]}"
done
الانتاج عند بدء التشغيل:
عدد العناصر الموجودة في مجموعة الأصلي: 4
البند الأول
البند الثاني
الثالث
البند
بعد التوسع غير المدرجة: 6
الأولى
البند
الثاني
البند
الثالث
البند
بعد التوسع * نقلا عن: 1
البند الأول البند الثاني البند الثالث
بعد @ التوسع نقلت: 4
الأولى البند
الثاني البند
الثالث
البند