آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

بسط ابرو

بسط ابرو

بسط ابرو یکی از جایگزینی‌هایی است که Bash روی فرمانها انجام می‌دهد. این بسط در ماهیت کاملاً مطابق قواعد دستور زبان است(درکی از مضمون ندارد). در اصل، به عنوان یک میانبر نوشتاری، برای فشرده سازی بیشتر فرمانها به کار می‌رود:

mv foobar.{o,exe} obj

# :معادل است با
mv foobar.o foobar.exe obj

یک بسط ابرو به یک کلمه یا بیشتر منجر می‌گردد. همه کاراکترهای خارج از ابروها در هر کلمه تکرار می‌شوند. ابروها محتوایی را که در بین کلمات متغیر است، تعیین می‌کنند.

بسط‌های ابرو می‌توانند رشته‌های جدا شده با کاما را، به طوری که در مثال فوق نشان داده شده به کار ببرند. به طوری که از ‎Bash 3.0‎، آنها می‌توانند برای دامنه حروف یا اعداد نیز استفاده شوند. این مورد به عنوان «بسط توالی» شناخته می‌شود:

for i in {1..10} {a..f}; do
  sleep 1
  echo $i
done

بسط ابرو قبل از بسط پارامتر انجام می‌شود، این مطلب تقریباً استفاده از بسط ابرو برای ایجاد لیست‌هایی که اندازه آنها فقط در حین اجرا معلوم می‌شود، را غیر ممکن می‌سازد.

# !کار نخواهد کرد‎
for i in {1..$n}; do

در موقعیت تکرار ساده روی اعداد صحیح، یک حلقه محاسباتی for تقریباً همیشه نسبت به بسط ابرو ترجیح خواهد داشت، زیرابسط ابرو هر شناسه‌ای را که می‌تواند آرام‌تر باشد نیز از قبل بسط می‌دهد و حافظه را به طور غیر ضرور مصرف می‌کند.

for ((i=1; i<=n; i++)); do
...
done

در موقعیت تولید لیست‌های شناسه نیز یک حلقه می‌تواند برای ساختن یک آرایه به کار برود.

pushd ~/music

while ((i<=n)); do
    args+=( @(foo|bar)$((i++)).mp3 )
done

cmd "${args[@]}"
popd

قابلیت حمل

  • بسط ابرو توسط POSIX تعریف نگردیده است. این بسط ابتدا در csh معرفی شد، اما ksh93، Zsh، Bash، و mksh همه ویژگی‌های بسط ابروی مشابه دارند. mksh از بسط توالی پشتیبانی نمی‌کند، و zsh به طور پیش‌فرض فقط از بسط توالی روی اعداد صحیح پشتیبانی می‌کند، لیکن بسیاری موارد الحاقی خود را دارد. در ksh93 بسط ابرو به طور پیش‌فرض فعال نیست، در Bash هست.

  • تنها Bash بسط ابرو را اول انجام می‌دهد. ksh93، zsh، و mksh بسط ابرو را بلافاصله قبل از بسط نام مسیر ارزیابی می‌کنند. ksh93 آن را بخشی از تفکیک کلمه در نظر می‌گیرد. این یعنی پوسته‌های دیگر مشکل بسط پارامترها در داخل بسط‌های ابرو را متحمل نمی‌شوند:

# zsh یا ksh93 در

$ n=5; echo {1..$n}
1 2 3 4 5

ترتیب ارزیابی Bash یک موهبت مختلط است. از یک طرف اجازه می‌دهد نتایج بسط ابرو موضوع تمام جایگزینی‌های ذیگر بشود، به طوری که همه بسط‌های تولید شده ارزیابی می‌شوند:

#Bash

$ echo $((n++)){1..5}
01 12 23 34 45

# zsh or ksh93

$ echo $((n++)){1..5}
01 02 03 04 05

از طرف دیگر، از این که متایج سایر جایگزینی‌ها در بسط‌های ابرو تفسیر گردن پیش‌گیری می‌کند، این مطلب احتمالاً بسط ابرو را به طور جزئی برای فعال بودن به طور پیش‌فرض، ایمن‌تر می‌سازد، آنطور که در Bash هست، بسته به آن که شما سعی دارید جه کاری انجام بدهید، هر دو مورد می‌توانند خوب یا بد باشند. این یکی از حد وسط‌های تأسف‌آور است.

See Also


CategoryShell

بسط ابرو (آخرین ویرایش ‎2012-03-30 18:13:14‎ توسط ormaaj)