Bash نگارش۳

فصل ‎37‎-‏ Bash، نگارش‌های ‎2‎‏، ‎3‎‏، و ‎4‎

‎37.2‎- ‏Bash، نگارش ‎3‎

در ‎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‎ را ببینید.

Caution

Bash نگارش ‎3‎ اندکی از اسکریپت‌هایی را که تحت نگارش‌های قبلی کار می‌کردند ناموفق می‌گرداند. اسکریپت‌های حساس موروثی را برای کسب اطمینان از اینکه آنها بازهم کار می‌کنند، آزمایش کنید!

اتفاقاً، تعداد کمی از اسکریپت‌ها در Advanced Bash Scripting Guide (این کتاب) می‌بایست اصلاح می‌گردیدند (برای نمونه، مثال ‎9-4‎ را ببینید).

‎37.2.1‎- ‏Bash، نگارش ‎3.1‎

به روز رسانی 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
    

‎37.2.2‎- ‏Bash، نگارش ‎3.2‎

این تقریبا یک به روز رسانی اصلاح باگ است.