راهنمای آموزشی اسکریپت نویسی - مقدماتی

لطفا برای بهتر دیدن صفحه از firefox استفاده کنید
Bash Guide for Beginners Machtelt Garrels

راهنمای Bash برای نوآموزان

ایجاد منو با دستور داخلی select »
« خلاصه

دستور داخلی shift

چه کار می‌کند؟

فرمان 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

[Note]-exec vs. xargs 

دستور find بالامی‌تواند با دستور زیر تعویض گردد:

find options | xargs [commands_to_execute_on_found_files]

دستور xargs از ورودی استاندارد سطرهای فرمان می‌سازد و اجرا می‌کند. فایده این آنست که سطر فرمان تا رسیدن به محدوده سیستم، پر می‌شود. فقط بعد فرمانی که باید اجرا بشود، فراحوانده می‌شود، در مثال فوق فرمان rm بود. اگر شناسه‌های بیشتری وجود داشته باشد، یک سطر فرمان جدید استفاده می‌شود، تا یک سطر کامل شود یا آنکه شناسه‌های دیگری موجود نباشد. همانطور با استفاده ‎ find -exec‎ فرمان را برای اجرا روی فایلهای پیدا شده در هر نوبتی که فایلی یافت می‌شود، فرامی‌خواند. بنابراین، کاربردxargs به اندازه زیادی سرعت اسکریپت‌ها و کارایی ماشین شما را بالا می‌برد.

مترجم:به طور خلاصه در صورتی که دستور مورد نظر برای اجرا rm باشد، دستور find فایلی با مشخصات مورد نظر را یافته از طریق لوله به xargs می‌دهد ، و این روال تا موقعی که دیگر ورودی از لوله دریافت نشود ادامه می‌یابد حالا xargs به نوبه خود سطر فرمانی از دستور rm و ورودی‌های دریافتی از لوله به عنوان شناسه‌ها تشکیل داده و اجرا می‌کند(فایل‌های پیدا شده حذف می‌گردند ) .

در مثال بعدی، ما اسکریپت بخشی تحت عنوان«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
ایجاد منو با دستور داخلی select »
« خلاصه
ترجمه محمود پهلوانی