کنترل پارامترهای موقعیت دسته جمعی
گاهی اوقات مدیریت تمام پارامترهای موقعیتی به صورت گروهی مفید است. به عنوان مثال، ممکن است بخواهیم یک "wrapper" در اطراف برنامه دیگری بنویسیم. این بدان معناست که ما یک اسکریپت یا تابع پوسته ایجاد می کنیم که فراخوانی یک برنامه دیگر را ساده می کند. Wrapper، در این مورد، فهرستی از گزینههای خط فرمان محرمانه را ارائه میکند و سپس فهرستی از آرگومانها را به برنامه سطح پایینتر ارسال میکند.
پوسته دو پارامتر ویژه برای این منظور فراهم می کند. هر دو به فهرست کامل پارامترهای موقعیتی گسترش می یابند، اما به روش های نسبتاً ظریفی با هم تفاوت دارند. آن ها هستند:
جدول 32-1: پارامترهای ویژه * And @
شرح پارامتر
شرح پارامتر
$* به فهرست پارامترهای موقعیتی گسترش مییابد، که با 1 شروع میشود. وقتی با گیومههای دوتایی احاطه میشود، به یک رشته نقلقول دوتایی که شامل تمام پارامترهای موقعیتی است، گسترش مییابد که هر کدام با اولین کاراکتر متغیر پوسته IFS (به طور پیشفرض یک فاصله) از هم جدا میشوند. شخصیت).
$@ به فهرست پارامترهای موقعیتی گسترش مییابد، که با 1 شروع میشود. هنگامی که با گیومههای دوتایی احاطه میشود، هر پارامتر موقعیتی را به یک کلمه جداگانه که با گیومههای دوتایی احاطه شده است، گسترش میدهد.
در اینجا یک اسکریپت است که این پارامترهای خاص را در عمل نشان می دهد:
دست زدن به پارامترهای موقعیت انبوه
#! / bin / bash
# posit-params3: اسکریپت برای نمایش $* و $@ print_params () {
echo "\$1 = $1" echo "\$2 = $2" echo "\$3 = $3" echo "\$4 = $4"
}
pass_params () {
echo -e "\n" '$* :'; print_params $* echo -e "\n" '"$*" :'; print_params "$*" echo -e "\n" '$@ :'; print_params $@ echo -e "\n" '"$@" :'; print_params "$@"
}
pass_params "word" "کلمات با فاصله"
#! / bin / bash
# posit-params3: اسکریپت برای نمایش $* و $@ print_params () {
echo "\$1 = $1" echo "\$2 = $2" echo "\$3 = $3" echo "\$4 = $4"
}
pass_params () {
echo -e "\n" '$* :'; print_params $* echo -e "\n" '"$*" :'; print_params "$*" echo -e "\n" '$@ :'; print_params $@ echo -e "\n" '"$@" :'; print_params "$@"
}
pass_params "word" "کلمات با فاصله"
در این برنامه نسبتاً پیچیده، ما دو آرگومان ایجاد می کنیم: "word" و "words with space" و آنها را به pass_params عملکرد. آن تابع، به نوبه خود، آنها را به print_params تابع، با استفاده از هر یک از چهار روش موجود با پارامترهای خاص $* و $@. هنگام اجرا، اسکریپت تفاوت ها را نشان می دهد:
[me@linuxbox ~]$ posit-param3
$* :
$1 | = | کلمه |
$2 | = | کلمات |
$3 | = | با |
$4 | = | فضاها |
"$*" :
$1 | = | کلمات کلمه با فاصله |
$2 | = | |
$3 | = | |
$4 | = |
$@ :
$1 | = | کلمه |
$2 | = | کلمات |
$3 | = | با |
$4 | = | فضاها |
"$@" :
1 دلار = کلمه
$2 = کلمات با فاصله
3 دلار =
4 دلار =
$2 = کلمات با فاصله
3 دلار =
4 دلار =
با استدلال های ما، هر دو $* و $@ یک نتیجه چهار کلمه ای ایجاد کنید:
کلمات کلمه با فاصله
"$*" یک نتیجه یک کلمه ای ایجاد می کند:
"کلمات با فاصله"
"$@" یک نتیجه دو کلمه ای ایجاد می کند:
"کلمه" "کلمات با فاصله"
که با هدف واقعی ما مطابقت دارد. درسی که از این می توان گرفت این است که حتی اگر پوسته چهار راه مختلف برای دریافت لیست پارامترهای موقعیتی ارائه می دهد، "$@" تا حد زیادی برای اکثر موقعیت ها مفیدترین است، زیرا یکپارچگی هر پارامتر موقعیتی را حفظ می کند.