التعامل مع المعلمات الموضعية بشكل جماعي
من المفيد أحيانًا إدارة جميع المعلمات الموضعية كمجموعة. على سبيل المثال ، قد نرغب في كتابة "غلاف" حول برنامج آخر. هذا يعني أننا نقوم بإنشاء برنامج نصي أو دالة shell التي تبسط استدعاء برنامج آخر. يوفر الغلاف ، في هذه الحالة ، قائمة بخيارات سطر الأوامر الغامضة ثم يمرر قائمة الحجج إلى برنامج المستوى الأدنى.
يوفر الغلاف معلمتين خاصتين لهذا الغرض. كلاهما يتوسع في القائمة الكاملة للمعلمات الموضعية ، لكنهما يختلفان بطرق دقيقة إلى حد ما. هم انهم:
الجدول 32-1: المعلمات الخاصة * و @
المعلمة الوصف
المعلمة الوصف
$ * يتم توسيعه إلى قائمة المعلمات الموضعية ، بدءًا من 1. عند إحاطته بعلامات اقتباس مزدوجة ، فإنه يتوسع إلى سلسلة مقتبسة مزدوجة تحتوي على جميع المعلمات الموضعية ، ويفصل كل منها بالحرف الأول من متغير غلاف IFS (افتراضيًا مسافة اختلاف الشخصيات).
$ @ يتوسع في قائمة المعلمات الموضعية ، بدءًا من 1. عندما تكون محاطة بعلامات اقتباس مزدوجة ، فإنها توسع كل معلمة موضعية إلى كلمة منفصلة محاطة بعلامات اقتباس مزدوجة.
إليك نص يُظهر هذه المعلمات الخاصة أثناء العمل:
التعامل مع المعلمات الموضعية في جملة
#! / بن / باش
# posit-params3: البرنامج النصي لإظهار $ * و $ @ print_params () {
صدى "\ $ 1 = $ 1" echo "\ $ 2 = $ 2" echo "\ $ 3 = $ 3" echo "\ $ 4 = $ 4"
}
pass_params () {
صدى -e "\ n" '$ *:'؛ print_params $ * echo -e "\ n" "" $ * ": '؛ print_params "$ *" echo -e "\ n" '$ @:'؛ print_params $ @ echo -e "\ n" "" $ @ ": '؛ print_params "$ @"
}
pass_params "word" "كلمات بها مسافات"
#! / بن / باش
# posit-params3: البرنامج النصي لإظهار $ * و $ @ print_params () {
صدى "\ $ 1 = $ 1" echo "\ $ 2 = $ 2" echo "\ $ 3 = $ 3" echo "\ $ 4 = $ 4"
}
pass_params () {
صدى -e "\ n" '$ *:'؛ print_params $ * echo -e "\ n" "" $ * ": '؛ print_params "$ *" echo -e "\ n" '$ @:'؛ print_params $ @ echo -e "\ n" "" $ @ ": '؛ print_params "$ @"
}
pass_params "word" "كلمات بها مسافات"
في هذا البرنامج المعقد نوعًا ما ، ننشئ حجتين: "كلمة" و "كلمات بها مسافات" ، ونمررها إلى تمر_المعلمات وظيفة. تقوم هذه الوظيفة بدورها بتمريرها إلى ملف print_params دالة ، باستخدام كل من الطرق الأربع المتاحة مع المعلمات الخاصة $* و $@. عند تنفيذه ، يكشف النص عن الاختلافات:
[me @ linuxbox ~] $ الموضع بارام 3
دولار *:
$1 | = | كلمة |
$2 | = | كلمات |
$3 | = | مع |
$4 | = | المساحات |
"$ *":
$1 | = | كلمات مع مسافات |
$2 | = | |
$3 | = | |
$4 | = |
@ $:
$1 | = | كلمة |
$2 | = | كلمات |
$3 | = | مع |
$4 | = | المساحات |
"$ @":
1 دولار = كلمة
2 دولار = كلمات بمسافات
3 دولارًا =
4 دولارًا =
2 دولار = كلمات بمسافات
3 دولارًا =
4 دولارًا =
مع حججنا ، على حد سواء $* و $@ الحصول على نتيجة من أربع كلمات:
كلمات مع مسافات
ينتج عن "$ *" نتيجة من كلمة واحدة:
"كلمات مع مسافات"
ينتج عن "$ @" نتيجة من كلمتين:
"كلمة" "كلمات بها مسافات"
الذي يطابق نيتنا الفعلية. الدرس المستفاد من هذا هو أنه على الرغم من أن الغلاف يوفر أربع طرق مختلفة للحصول على قائمة المعلمات الموضعية ، "$@"إلى حد بعيد هو الأكثر فائدة لمعظم المواقف ، لأنه يحافظ على سلامة كل معلمة موضعية.