فرمان shift یکی از دستورات داخلی پوسته بورن است که همراه Bash میباشد . این دستور یک شناسه میپذیرد، یک عدد. پارامترهای موضعی به اندازه این عدد N به سمت چپ جابجا میشوند . پارامترهای موضعی از N+1
تا $#
به متغیرهای $1
تا $# - N+1
نام گزاری مجدد میشوند.
فرض کنیددستوری دارید که ۱۰ شناسه میپذیرد، و N برابر ۴ است، آن وقت $5
میشود $1
و $6
میشود $2
و به همین ترتیب. $10
میشود $6
و $1
و $2
و $3
و $4
اولیه دور انداخته شدهاند.
اگر N صفر یا بزرگتر از $#
باشد، پارامترهای موضعی تغییر نمیکنند( تعداد کل شناسهها، بخشی به نام«بررسی شناسههای خطفرمان» را ببینید) و دستور تأثیری ندارد. اگر N حاضر نباشد، فرض میشود که یک است. کد برگشتی صفر است، مگر اینکه N بزرگتر از $#
یا کوچکتر از صفر باشد،که در این حالت غیر صفر است.
فقط یک تست ساده برای نمایش دادن موارد فوق:
[john@fenix testdir]
cat test.sh
#!/bin/bash
echo "$@"
shift 4
echo "$@"
موقعی که این اجرا میشود:
[john@fenix testdir]
./test.sh 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10 5 6 7 8 9 10[john@fenix testdir]
./test.sh 1 2 3 1 2 3 1 2 3
یک جمله shift به طور نوعی موقعی به کار میرود که تعداد شناسههای یک دستور از پیش معلوم نمیباشد، به عنوان نمونه وقتی که کاربر میتواند به هر اندازه که بخواهد شناسه به کار ببرد. در چنین حالاتی، به طور معمول شناسهها در یک حلقه while به بررسی شرط (( $# )) پردازش میشوند. این شرط تا وقتی که تعداد شناسهها بزرگتر از صفر باشد صحیح است. متغیر $1
و جمله shift هر شناسه را پردازش میکنند. هر دفعه که shift اجرا میشود، تعداد شناسهها کاهش مییابد و سرانجام صفر میشود، که در اینجا حلقه while خارج میشود.
در مثال زیر، cleanup.sh
، دستورات shift برای پردازش هر فایل در لیست تولیده شده با find به کار میرود:
#!/bin/bash # This script can clean up files that were last accessed over 365 days ago. USAGE="Usage: $0 dir1 dir2 dir3 ... dirN" if [ "$#" == "0" ]; then echo "$USAGE" exit 1 fi while (( "$#" )); do if [[ $(ls "$1") == "" ]]; then echo "Empty directory, nothing to be done." else find "$1" -type f -a -atime +365 -exec rm -i {} \; fi shift done
-exec vs. xargs | |
---|---|
دستور find بالامیتواند با دستور زیر تعویض گردد:
دستور xargs از ورودی استاندارد سطرهای فرمان میسازد و اجرا میکند. فایده این آنست که سطر فرمان تا رسیدن به محدوده سیستم، پر میشود. فقط بعد فرمانی که باید اجرا بشود، فراحوانده میشود، در مثال فوق فرمان rm بود. اگر شناسههای بیشتری وجود داشته باشد، یک سطر فرمان جدید استفاده میشود، تا یک سطر کامل شود یا آنکه شناسههای دیگری موجود نباشد. همانطور با استفاده find |
در مثال بعدی، ما اسکریپت بخشی تحت عنوان«Here documents» را ویرایش کردهایم، به طوریکه چندین بسته را به طور یکجا برای نصب دریافت کند:
#!/bin/bash if [ $# -lt 1 ]; then echo "Usage: $0 package(s)" exit 1 fi while (($#)); do yum install "$1" << CONFIRM y CONFIRM shift done