حمل کردن یک پوسته آسانتر از حمل یک اسکریپت پوسته است. --Larry Wall |
این کتاب بویژه با اسکریپتنویسی Bash روی یک سیستم گنو-لینوکس سر و کار دارد. با وجود این، کاربران sh و ksh مطالب با ارزشی در اینجا خواهند یافت.
اتفاقاً، به نظر میرسد بسیاری از پوستههای مختلف و زبانهای اسکریپتنویسی در حال توجه یافتن به طرف استاندارد 1003.2 POSIX هستند. فراخوانی Bash با گزینه --posix یا درج کردن set -o posix در ابتدای یک اسکریپت باعث میشود Bash با دقت بسیار از این استاندارد پیروی نماید. یک جایگزین دیگر استفاده از سرآیند شبانگ #!/bin/sh به جای #!/bin/bash در اسکریپت است. [1] توجه نمایید که /bin/sh در لینوکس و برخی از دیگر طعمهای یونیکس، یک link به /bin/bash است، و یک اسکریپت احضار شده به این روش قابلیتهای توسعه یافته Bash را غیر فعال میکند.
اکثر اسکریپتهای Bash همانطور که هستند در ksh اجرا خواهند شد، و بالعکس، چون Chet Ramey با فعالیت تمام مشغول انتقال ویژگیهای ksh به آخرین نگارشهای Bash بوده است.
روی یک ماشین یونیکس تجاری، ممکن است اسکرپیتهایی که از ویژگیهای مختص گنو فرمانهای استاندارد استفاده میکنند، کار نکنند. در سالهای اخیر این مشکل کم شده است، چون برنامههای سودمند GNU تقریباً جانشین همتاهای مالکانهشان، حتی روی UNIX «گران قیمت» شدهاند. آزاد کردن کد Caldera برای بسیاری از برنامههای سودمند اصلی یونیکس به این رویداد شتاب داده است.
Bash دارای ویژگیهای خاصی است که پوسته Bourne قدیمی فاقد آنهاست. از جمله این ویژگیها عبارتند از:
برخی گزینههای فراخوانی توسعه یافته
جایگزینی فرمان با استفاده از نشانهگذاری $( )
برخی عملیات آرایه و آرایههای انجمنی
ساختار تست توسعه یافته براکتهای دوتایی
ساختار ارزیابی حسابی پرانتزهای دوتایی
برخی عملیات دستکاری رشته
یک عملگر انطباق عبارت منظم
فرمانهای داخلی مختص Bash
برای یک لیست کامل، Bash F.A.Q را ملاحظه نمایید.
اجازه بدهید برخی ناسازگاریهای میان Bash و پوسته Bourne کلاسیک را روشن کنیم. پوسته "Heirloom Bourne Shell" را دانلود و نصب کرده و اسکریپت پایین را اجرا کنید، نخست با استفاده از Bash و سپس با پوسته sh کلاسیک.
#!/bin/bash # #یک مجموعه آزمایش نیمه کامل سازگاری Bash. #این اسکریپت را روی نگارش Bash خود یا برخی پوستههای دیگر اجرا کنید. default_option=FAIL #تستهای زیر ناموفق میشوند مگر اینکه. . . echo echo -n "Testing " sleep 1; echo -n ". " sleep 1; echo -n ". " sleep 1; echo ". " echo #براکتهای دوگانه String="Double brackets supported?" echo -n "Double brackets test: " if [[ "$String" = "Double brackets supported?" ]] then echo "PASS" else echo "FAIL" fi #براکتهای دوگانه و انطباق عبارت منظم String="Regex matching supported?" echo -n "Regex matching: " if [[ "$String" =~ R.....matching* ]] then echo "PASS" else echo "FAIL" fi #آرایهها test_arr=$default_option #FAIL Array=( If supports arrays will print PASS ) test_arr=${Array[5]} echo "Array test: $test_arr" #جایگزینی فرمان csub_test () { echo "PASS" } test_csub=$default_option #FAIL test_csub=$(csub_test) echo "Command substitution test: $test_csub" echo #کامل کردن این اسکریپت تمرینی برای خوانده است. #تستهای مشابه فوق برای پرانتزهای دوگانه، بسط ابرو #+جایگزینی پردازش، و غیره اضافه کنید. exit $?
[1] | یا، از آن هم بهتر، #!/bin/env sh |