در 27 جولای 2004، Chet Ramey نگارش 3 از Bash را منتشر نمود. این به روز رسانی یک تعداد از باگها را کاملاً اصلاح نموده و ویژگیهای جدید اضافه کرد.
برخی از مهمترین ویژگیهای افزوده شده:
یک عملگر جدید {a..z} تعمیمیافتهتر بسط ابرو.
#!/bin/bash for i in {1..10} #سادهتر و روانتر از for i in $(seq 10) do echo -n "$i " done echo # #یا فقط . . . echo {a..z} # echo {e..m} # echo {z..a} # #به طور معکوس هم کار میکند. echo {25..30} # echo {3..-2} # echo {X..d} # #(برخی از) کاراکترهای اسکی بین Z و a را نشان میدهد، #+اما به این نوع از رفتار اطمینان نکنید زیرا . . . echo {]..a} # #چرا؟ #میتوانید پیشوندها و پسوندها را اضافه کنید. echo "Number #"{1..4}, "..." # #میتوانید مجموعههای بسط ابرو را بهم الحاق کنید. echo {1..3}{x..z}" +" "..." # #یک عبارت جبری تولید میکند. #این میتواند برای یافتن جایگشتها به کار برود. #میتوانید مجموعههای بسط ابرو را تو در تو کنید. echo {{a..c},{1..3}} # #عملگر کاما رشتهها را به یکدیگر گره میزند. ########### ######### ############ ########### ######### ############## # #متاسفانه، بسط ابرو برای پارامتری کردن مناسب نیست. var1=1 var2=5 echo {$var1..$var2} # #بازهم، همچنانکه Emiliano G. اشاره میکند، با کاربرد eval بر این محدودیت غلبه میشود. start=0 end=10 for index in $(eval echo {$start..$end}) do echo -n "$index " # done echo
عملگر ${!array[@]} که به تمام شاخصهای یک آرایه مفروض بسط مییابد.
#!/bin/bash Array=(element-zero element-one element-two element-three) echo ${Array[0]} #عنصر شماره صفر #اولین عنصر آرایه. echo ${!Array[@]} # #تمام شاخصهای آرایه. for i in ${!Array[@]} do echo ${Array[i]} # # # # #تمام عناصر در آرایه. done
عملگر انطباق عبارت منظم =~ در درون یک عبارت تست براکتهای دوگانه. (پرل دارای یک عملگر مشابه آن است.)
#!/bin/bash variable="This is a fine mess." echo "$variable" #انطباق Regex با عملگر =~ در درون [[ براکتهای دوتایی ]]. if [[ "$variable" =~ T.........fin*es* ]] #توجه: از Bash نگارش 3.2، دیگر عبارت برای انطباق نقلقولی نمیشود. then echo "match found" #match found fi
یا، به طور مفیدتر:
#!/bin/bash input=$1 if [[ "$input" =~ "[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]" ]] #توجه: از Bash نگارش 3.2، نقلقول کردن لازم نیست. #NNN-NN-NNNN (که هر N یک رقم است). then echo "Social Security number." #پردازش شماره تامین اجتماعی. else echo "Not a Social Security number!" #یا، درخواست ورودی تصحیح شده. fi
برای مثالهای بیشتری از کاربرد عملگر =~ مثال A-29، مثال 19-14، مثال A-35، و مثال A-24 را ببینید.
گزینه جدید set -o pipefail برای اشکالزدایی لولهها مناسب است. اگر این گزینه تنظیم شده باشد، آنوقت وضعیت خروج یک لوله، به جای آخرین فرمان واقعی در لوله، وضعیت خروج آخرین فرمانی از لوله است که ناموفق بوده (برگشت مقدار غیر صفر).
مثال 16-43 را ببینید.
Bash نگارش 3 اندکی از اسکریپتهایی را که تحت نگارشهای قبلی کار میکردند ناموفق میگرداند. اسکریپتهای حساس موروثی را برای کسب اطمینان از اینکه آنها بازهم کار میکنند، آزمایش کنید! اتفاقاً، تعداد کمی از اسکریپتها در Advanced Bash Scripting Guide (این کتاب) میبایست اصلاح میگردیدند (برای نمونه، مثال 9-4 را ببینید). |
به روز رسانی Bash در نگارش 3.1 یک تعداد اصلاح باگ و چند تغییر جزیی ارایه نمود.
در محلهایی که قبلاً در آنها فقط عملگر تخصیص = به رسمیت شناخته میشد، اکنون عملگر += نیز مجاز است.
a=1 echo $a # a+=5 #تحت Bash نگارشهای قبل از 3.1 کار نخواهد کرد. echo $a # a+=Hello echo $a #15Hello
اینجا، += مانند عملگر الحاق رشته عمل میکند. توجه نمایید که در این مضمون خاص رفتار آن متفاوت با رفتارش در داخل یک ساختار let است.
a=1 echo $a # let a+=5 #حساب صحیح به جای الحاق رشتهای. echo $a # let a+=Hello #چیزی به a اضافه نمیکند. echo $a #
Jeffrey Haemer اشاره میکند که این عملگر الحاق میتواند کاملا مفید باشد. در این نمونه، ما یک دایرکتوری را به $PATH پیوست میکنیم.
bash$ echo $PATH /usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin/:/usr/games bash$ PATH+=:/opt/bin bash$ echo $PATH /usr/bin:/bin:/usr/local/bin:/usr/X11R6/bin/:/usr/games:/opt/bin
این تقریبا یک به روز رسانی اصلاح باگ است.
در جایگزینیهای پارامتر global ، دیگر الگو در ابتدای رشته مهار نمیشود.
گزینه --wordexp جایگزینی پردازش را از کار میاندازد.
عملگر انطباق عبارت منظم =~ دیگر به نقلقول کردن الگو در درون [[ ... ]] نیاز ندارد.
در واقع، نقلقول کردن در این مضمون مصلحت نیست چون ممکن است باعث شکست ارزیابی regex بشود. Chet Ramey در Bash FAQ اظهار میکند که نقلقول کردن به طور وضوح ارزیابی regex (عبارت منظم) را غیر فعال میسازد. همچنین Wikinerds on Bash syntax و Ubuntu Bug Listرا ملاحظه کنید. تنظیم shopt -s compat31 در یک اسکریپت باعث بازگشت به رفتار اولیه میگردد. |