چند روش موجود است که میتوانید آرایهها را ایجاد نموده یا با دادهها پر کنید. یک روش صحیح منفرد وجود ندارد: روشی که شما نیاز خواهید داشت بستگی به آن دارد که دادهها کدامند و از کجا میآیند.
سادهترین راه برای ایجاد یک آرایه ساده با داده، استفاده از ترکیب
$names =( "Bob" "Peter" "$USER" "Big Bad John" )
این ترکیب دستوری(syntax) برای ایجاد آرایههایی با دادههای ایستا یا مجموعهای از پارامترهای رشتهای معلوم، عالی است، اما قابلیت انعطاف بسیار کمی برای افزودن مقادیر زیاد عناصر آرایه، در اختیار میگذارد. اگر انعطاف پذیری بیشتری میخواهید، میتوانید از شاخصهای صریح استفاده کنید:
$names =( # or... $[0] ="Bob"[1] ="Peter"[20] ="$USER"[21] ="Big Bad John")names [0] = "Bob"
توجه نمایید که بین شاخص 1و 20 در این مثال یک شکاف وجود دارد. یک آرایه باحفرههایی در آن آرایه پراکنده نامیده میشود. Bash این امر را اجازه میدهد واغلب میتواند کاملاً سودمند باشد.
اگر میخواهید یک آرایه را با نام فایلها پر کنید، ممکن است احتمالاً بخواهید از Globs استفاده کنید:
$photos =(~/"My Photos"/*.jpg)
توجه نمایید که در اینجا بخش
متأسفانه، به راستی ایجاد آرایههای ابهام آمیز با یک گروه نام فایل که به روش زیر ایجاد میشوند، آسان است:
$files =$(ls) # BAD, BAD, BAD! $files =($(ls)) # STILL BAD!
به یاد داشته باشید همیشه از کاربرد ls به این شکل پرهیز کنید، اولی یک رشته با خروجی فرمان ls ایجاد میکند. آن رشته احتمالاً به دلیلی که در مقدمه
روش صحیح انجام آن این است:
$files =(*) # Good!
این جمله یک آرایه به ما میدهد که در آن هر نام فایل یک عنصر جداگانه است. کامل!
این بخش که در اینجا مطرح میکنیم شامل برخی مفاهیم پیشرفته است. اگر هنوز آماده نیستید، شاید بخواهید پس از اینکه تمام این راهنما را خواندید به اینجا بازگردید. اگر میخواهید با موارد ساده ادامه دهید، میتوانید بااستفاده از آرایهها به پیش بروید.
گاهی اوقات میخواهیم یک آرایه از یک رشته یا خروجی یک فرمان تشکیل بدهیم. خروجی فرمانها رشته هستند: برای نمونه، اجرای یک فرمان find نام فایلها را به شمار میآورد و آنها را با یک کاراکتر سطر جدید(قرار دادن هر نام فایل در یک سطر جداگانه) از هم جدا میکند. بنابراین برای تفکیک یک رشته بزرگ به داخل یک آرایه، لازم است به Bash بگوییم هر عضو کجا به انتها میرسد. (تذکر، این یک مثال بد است، چون نام فایل میتواند شامل یک سطر جدید باشد،بنابراین جدا کردن آنها با سطر جدید نمیتواند ایمن باشد! اما مثال زیر را نگاه کنید.)
آنچه برای شکستن یک رشته به کار میرود محتوای متغیر
$IFS = . read-a ip_elements <<< "127.0.0.1"
در اینجا از متغیر
(دستور داخلی read و عملگر
میتوانستیم همین کار را با دستور find انجام بدهیم، در صورتیکه متغیر
بنابراین، آیا روشی برای دریافت لیستی از عناصر از یک برنامه خارجی ( مانند find) در یک آرایه Bash وجود دارد؟ به طور کلی، پاسخ بلی است، به شرط آنکه راه قابل اطمینانی برای جداسازی عناصر موجود باشد.
در یک حالت خاص از نام فایلها، پاسخ این مشکل، بایتهای تهی(NUL) است. یک بایت تهی، بایتی است که همه بیتهای آن صفر است: 00000000. رشتههای Bash نمیتوانند شامل بایتهای تهی باشند، به عنوان یک محصول زبان برنامهنویسی "C" : در زبان C بایت تهی برای علامت گذاری انتهای رشته به کاررفته است. از این جهت Bash که به زبان C نوشته شده و از رشتههای بومی C استفاده میکند، این رفتار را به ارث میبرد.
یک جریان داده( مانند خروجی یک فرمان، یا یک فایل ) میتواند شامل بایت تهی باشد. جریانها مانند رشتهها هستند، با سه تفاوت عمده: آنها به صورت ترتیبی خوانده میشوند(به طور معمول نمیتوانید با پرش از روی آنها عبور کنید)، آنها یک سویه میباشند( شما میتوانید از آنها بخوانید یا در آنها بنویسید، اما به طور نوعی هر دو با هم میسر نیست )، و آنها میتوانند شامل بایتهای تهی باشند.
نه نامهای فایل میتوانند شامل بایت تهی باشند( چون آنها توسط یونیکس همانند رشتههای C تکمیل شدهاند )، و نه اکثریت وسیع اقلام قابل خواندن برای انسان که شاید ما بخواهیم در یک اسکریپت ذخیره کنیم(ازقبیل نام افراد، آدرسهای IP، و غیره ). این موضوع NUL را یک نامزد عالی برای جداسازی عناصر در یک جریان ، میسازد. به طور کلی اغلب، دستوری که میخواهید خروجی آن را بخوانید، یک گزینهای خواهد داشت، که خروجیاش را به صورت جدا شده با بایت تهی، به جای سطر جدید یا کاراکتر دیگری، ایجاد میکند.
files =() while read-r -d $'\0'; do files +=("$ REPLY ")done < <( find/ foo -print0 )
این یک روش مطمئن تفکیک خروجی یک فرمان به رشتهها میباشد. به طور قابل فهمی، ابتدا کمی به هم پیچیده و گیج کننده به نظر میرسد. لذا، بیایید کمی آن را باز کنیم:
سطر اول
ما از یک حلقه while استفاده میکنیم که هر مرتبه یک دستور read را اجرا میکند. فرمان read از گزینه
وقتی read مقداری از داده ها را میخواند و با یک بایت تهی مواجه میشود، بدنه حلقه
برای انجام این کار، ما از ترکیب
و سرانجام، ترکیب دستوری
همان طور که قبلاً بیان گردید، فرمان find خود با یک گزینه
آرایهها یک لیست مطمئن از رشتهها هستند. آنها برای نگهداری چندین نام فایل، بدون عیب میباشند.
اگر شما باید یک جریان داده را به اجزاء تشکیل دهنده عناصر تفکیک نمایید، باید طریقهای برای گفتن آنکه هر عنصر از کجا شروع و به کجا ختم میگردد، وجود داشته باشد. بسیاری اوقات، بایت تهی بهترین انتخاب برای این کار میباشد.
اگر لیستی از اقلام دارید، تا آنجا که ممکن است آن را به صورت یک لیست حفظ کنید. تا موقعی که واقعاً لازم نیست، آن را در یک رشته یا فایل تخریب نکنید. اگر باید به تفصیل آن را در یک فایل بنویسید و بعداً آنرا بخوانید، مشکل جداکننده را که در بالاتوضیح داده شد، به خاطر داشته باشید.
در مستندات گنو: Arrays
در پرسش و پاسخهای رایج:
چگونه میتوانم از متغیرهای آرایهای استفاده کنم؟
چطور میتوانم از متغیرهای متغیر( متغیرهای غیرمستقیم، اشارهگرها، مرجعها ) یا آرایههای انجمنی استفاده کنم؟
چگونه میتوانم نام فایلهای شامل کاراکتر سطرجدید، فاصله، یا هردو را پیدا کرده و با آنها کار کنم؟
من متغیرهایی را در یک حلقه مقرر میکنم. چرا آنها پس از اتمام حلقه، ناگهان ناپدید میگردند؟ یا، چرا نمیتوانم دادهها را برای خواندن لولهکشی نمایم؟
به طوری که قبلاً اشاره شد، BASH سه نوع پارامتر ارائه میکند: رشتهها، اعداد صحیح، و آرایهها.
بدون تردید رشتهها پر استفادهترین نوع پارامترها میباشند. اما آنها همچنین، بد رفتارترین نوع پارامترها هستند. اهمیت دارد که به خاطر بسپاریم، یک رشته فقط یک عنصر را نگاه میدارد. به عنوان نمونه، گرفتن خروجی یک فرمان، و قرار دادن آن در پارامتر رشتهای بدین معنا میباشد که پارامتر فقط یک رشته از کاراکترها میباشد، صرفنظر از اینکه آیا آن رشته نام بیست فایل، بیست عدد، یا نام بیست نفر را نمایندگی میکند.
و همینطور است که همیشه وقتی اقلام چندگانه را در یک رشته منفرد قرار میدهید، باید این اقلام را به طریقی از یکدیگر جدا کنید. ما، به عنوان انسان معمولاً میتوانیم وقتی به یک رشته نگاه میکنیم نام فایلهای مختلف را کشف کنیم. ما فرض میکنیم که، شاید، هر سطر در یک رشته نام یک فایل را نشان میدهد، یا هر کلمه نام یک فایل را نمایندگی میکند. در حالیکه این پنداشت قابل درک است، همچنین به طور ذاتی معیوب است. هر نام فایل منفرد میتواند شامل هر کاراکتری باشد که ممکن است شما بخواهید برای جداکردن نام فایلها در یک رشته استفاده کنید. به این معنی که از نظر تکنیکی گفته نمیشود که نام اولین فایل در کجای یک رشته به پایان میرسد، زیراکاراکتری وجود ندارد که بتواند بگوید: «من به پایان نام فایل اشاره میکنم» چون آن کاراکتر خودش میتواند بخشی از نام فایل باشد.
غالباً، اشخاص این اشتباه را مرتکب میگردند:
# این در حالت کلی کار نمیکند $files =$(ls ~/*.jpg); cp $ files /backups/
در حالیکه احتمالاً این میتواند ایده بهتری باشد( استفاده از آرایهها که در بخش بعد شرح داده میشوند):
# این در حالت کلی کار میکند $files =(~/* .jpg); cp "$ " /backups/{ files [@]}
تلاش اولی در پشتیبانگیری از فایلهای دایرکتوری جاری معیوب است. ما خروجی دستور ls را در یک رشته به نام
تنها روش مطمئن نشان دادن عناصر چندگانه رشته در Bash از طریق استفاده از آرایهها میباشد. آرایه نوعی متغیر است که رشتهها را با اعداد ترسیم میکند. این اساساً به معنای آن است که یک لیست شماره گذاری شده از رشتهها را نگهداری میکند. چون هر یک از این رشتهها یک هویت(عنصر) جداگانه است، میتواند بدون خطر هر کاراکتری، حتی فضای سفید را در خود داشته باشد.
برای بهترین نتیجه و کمترین دردسر، به خاطر بسپارید که اگر لیستی ازعناصر دارید، همیشه باید آنها را در یک آرایه قرار دهید.
بر خلاف برخی زبانهای برنامهنویسی، Bash لیستها، رکوردها و غیره را ارائه نکرده است. فقط آرایهها و آرایههای انجمنی( که در نگارش 4 از Bash جدید است).
آرایهها: یک آرایه لیست شماره گذاری شده رشتهها است: رشتهها را با اعداد صحیح مرتبط میکند .
گاهی اوقات میخواهید برنامهای منطقی بر مبنای محتوای یک متغیر بسازید. این میتوانست با گرفتن انشعابهای مختلف یک جمله
shopt-s extglobif [[ $ LANG = en*]] ;then echo 'Hello!'elif [[ $ LANG = fr*]] ;then echo 'Salut!'elif [[ $ LANG = de*]] ;then echo 'Guten Tag!'elif [[ $ LANG = nl*]] ;then echo 'Hallo!'elif [[ $ LANG = it*]] ;then echo 'Ciao!'elif [[ $ LANG = es*]] ;then echo 'Hola!'elif [[ $ LANG = @(C|POSIX)]] ;then echo 'hello world'else echo 'I do not speak your language.'fi
اما این همه مقایسه یک مقدار زائد است. BASH یک کلمهکلیدی به نام
case $ LANG in en *) echo 'Hello!';; fr *) echo 'Salut!';; de *) echo 'Guten Tag!';; nl *) echo 'Hallo!';; it *) echo 'Ciao!';; es *) echo 'Hola!';; C | POSIX) echo 'hello world';; *) echo 'I do not speak your language.';; esac
هر انتخاب در جمله
یک ساختار دیگر برای انتخاب، ساختار
به کاربر انتخابهایی ارائه میشود و از او درخواست میشود یک عدد منعکس کننده انتخابش را وارد کند کند. سپس کد داخل بلوک
$ echo "Which of these does not belong in the group?"; \ >select choice in Apples Pears Crisps Lemons Kiwis ; do >if [[ $ choice =Crisps ]] >then echo "Correct! Crisps are not fruit."; break; fi > echo "Errr... no. Try again." >done
تا موقعی که دستور break اجرا نشده است، منو باز تولید میشود. در این مثال دستور break فقط وقتی اجرا میشود که کاربر مورد صحیح را انتخاب نماید.
همچنین میتوانیم از متغیر
$PS3 = "Which of these does not belong in the group (#)? " \ >select choice in Apples Pears Crisps Lemons Kiwis ; do >if [[ $ choice = Crisps ]] >then echo "Correct! Crisps are not fruit."; break; fi > echo "Errr... no. Try again." >done
تمام این ساختارهای شرطی(
# یک منوی سادهwhile true; do echo "Welcome to the Menu" echo " 1. Say hello" echo " 2. Say good-bye" read-p "-> " responsecase $ response in 1 ) echo 'Hello there!';; 2 ) echo 'See you later!'; break;; *) echo 'What was that?';; esac done
تکرارمفید:
جمله
در مستندات گنو: Conditional Constructs
در پرسش و پاسخهای رایج:
چگونه میتوانم شناسههای( گزینههای ) خطفرمان را به آسانی مدیریت کنم؟
تا اینجا آموختهاید چگونه برخی تصمیمگیری های اساسی در اسکریپتهایتان را بسازید. اگر چه، برای انجام همه انواع وظایفی که ممکن است از اسکریپت بخواهیم کافی نمیباشد. گاهی اوقات نیاز به تکرار برخی کارها داریم. برای همین، کاربرد یک حلقه لازم است. دو نوع اصلی ازحلقه( به اضافه نوع دیگری) وجود دارد، و استفاده از نوع صحیح حلقه به شما در نگهداری خوانایی و قابلیت پشتیبانی اسکریپتهایتان کمک میکند.
دو نوع اساسی حلقهها
هر شکل از حلقهها با کلمهکلیدی
در عمل، حلقهها برای انواع مختلفی از وظایف به کار میروند. حلقه
در اینجا چند مثال برای تشریح تفاوتها و همچنین شباهتهای حلقهها میآوریم. (یادآوری: در اکثر سیستمعاملها، برای کشتن برنامهای که در ترمینال در حال اجرا است از ترکیب کلیدی
$while true >do echo "Infinite loop" >done
$while ! ping-c 1 -W 1 1.1.1.1; do > echo "still waiting for 1.1.1.1" > sleep 1 >done
$(( i =10 ));while (( >i >0 ))do echo "$ i empty cans of beer." >(( >i -- ))done $for (( >i =10 ;i >0 ;i -- ))do echo "$ i empty cans of beer." >done $for i in { 10..1 } >do echo "$ i empty cans of beer." >done
سه حلقه آخری با ترکیب متفاوت، دقیقاً به نتیجه یکسانی میرسند. در تجربه اسکریپتنویسی شل خود بارها با این مورد مواجه میشوید. تقریباً همیشه راهکارهای چندگانهای برای حل یک مسئله موجود است. به زودی تشحیص مهارت شما در حل مسئله نخواهد بود، آنقدر که درچگونگی
بیایید نگاه نزدیکتری به آن مثال آخری داشته باشیم، زیرا اگر چه از دو حلقه
به طوری که قبلاً اشاره کردهام:
$for i in 10 9 8 7 6 5 4 3 2 1 >do echo "$ i empty cans of beer." >done
BASH کاراکترهای بین کلمهکلیدی
در نتیجه،
$ lsThe best song in the world.mp3 $for file in $ (ls* .mp3 ) >do rm "$file" >done rm: cannot remove `The': No such file or directory rm: cannot remove `best': No such file or directory rm: cannot remove `song': No such file or directory rm: cannot remove `in': No such file or directory rm: cannot remove `the': No such file or directory rm: cannot remove `world.mp3': No such file or directory
شما از قبل نسبت به نقلقولی کردن
خواهید گفت، آن را نقلقولی میکنم؟ اجازه دهید فایل دیگری اضافه کنم:
$ lsThe best song in the world.mp3 The worst song in the world.mp3 $for file in "$(ls * .mp3)" >do rm "$ file" >done rm: cannot remove `The best song in the world.mp3 The worst song in the world.mp3': No such file or directory
نقلقولها به راستی از فضای سفید در نام فایلهای شما محافظت میکنند، اما چیزی بیش از آن انجام میدهند. نقلقولها از تمام فضاهای سفید خروجی فرمان ls محافظت خواهند کرد. راهی وجود ندارد که BASH بتواند تشخیص بدهد کدام بخشهای خروجی فرمان ls نام فایلها را نمایندگی میکنند. خروجی فرمان ls یک رشته ساده است، و BASH با آن به همین عنوان رفتار میکند. بعد
بنابراین چه کار بکنیم؟ به طوری که قبلاً پیشنهاد نمودم، جانشینها بهترین دوست شما هستند:
$for file in * .mp3 >do rm "$ file" >done
حالا، BASH میداند که با نام فایلها سروکار دارد، و نام فایها را میشناسد، و بنابراین به طور مطلوبی آنها راتفکیک میکند. نتیجه بسط جابشین چنین است:
حالا بیایید به حلقه
$ # ماشین نوشیدنی، نوشیدنیها را در ازای بهای ۲۰ سنت تحویل میدهد $while read-p $ 'The sweet machine.\n Insert 20c and enter your name: 'name >do echo "The machine spits out three lollipops at$ name ." >done
$ # هر پنج دقیقه یکبار ایمیل شما را بررسی میکند $while sleep 300 >do kmail--check >done
$ # برای برخط(آنلاین) شدن مجدد میزبان منتظر میماند $while ! ping-c 1 -W 1 "$ host " >do echo "$ host is still unavailable." >done ; echo-e "$ host is available again.\a"
حلقه
$ # برای برگشت میزبان به حالت آماده برقراری ارتباط منتظر میماند $until ping-c 1 -W 1 "$ host " >do echo "$ host is still unavailable." >done ; echo-e "$ host is available again.\a"
در عمل، اکثر مردم حقیقتاً از حلقه
بالإخره، از دستور داخلی continue برای پرش به جلو بدون اجرای بقیه بدنه و اجرای دور بعدی تکرار حلقه، و دستور داخلی break برای پریدن به خارج از حلقه و ادامه دستورات پس از حلقه در اسکریپت، میتوانید استفاده کنید. این دستورات با هر دو حلقه
در مستندات گنو: Looping Constructs
در پرسش و پاسخهای رایج:
چگونه میتوانم یک دستور را با تمام فایلهای دارای پسوند .gz اجرا کنم؟
چگونه میتوانم از اعدادی که با صفر شروع میشوند مثل 01 و 02 در یک حلقه استفاده کنم؟
چطو میتوانم نام فایلهای شامل کاراکتر فاصله یا سطر جدید یا هر دو را پیدا کرده وبا آنها کار کنم؟
میخواهم بررسی کنم که آیایک کلمه در یک لیست وجود دارد( یا یک عنصر عضوی از یک مجموعه هست).
حلقه: یک حلقه ساختاری است که برای تکرار کد تا موقع تحقق یک وضعیت معین، طراحی میشود. در آن نقطه حلقه متوقف میشود و کد بعد از آن اجرا میگردد.
$if true >then echo "It was true." >else echo "It was false." >fi It was true.
در اینجا یک نمای کلی اساسی از
افراد مختلف شیوههای متفاوتی از نوشتن جملات
if commandsthen other commandsfi -------------------if commandsthen other commandsfi -------------------if commands; then other commandsfi
چند دستور وجود دارد که به طور ویژه برای بررسی موارد و بازگرداندن وضعیت خروج نسبت به آنچه تشخیص میدهند، طراحی گردیدهاند. اولین دستور از این قبیل test میباشد( که [ نیز شناخته میشود.) یک نگارش پیشرفتهتر آن
$if [ a= b ] >then echo "a is the same as b." >else echo "a is not the same as b." >fi a is not the same as b.
حال ببینیم که چرا
$myname = 'Greg Wooledge' yourname= 'Someone Else' $ [$ myname = $ yourname ]-bash: [: too many arguments
میتوانید حدس بزنید چه مشکلی موجب بروز خطا شده؟
دستور [ با شناسههای
$ ["$ myname " = "$ yourname " ]
در این حالت [ دومین شناسه را یک عملگر(
برای کمی مساعدت با ما، پوسته Korn یک سبک جدید بررسی شرطی را معرفی نموده(و BASH نیز آن را اخذ کرده). مؤلف اصل اینها که
یکی از ویژگیهای
$[[ $ filename = * .png]] && echo "$ filename looks like a PNG file"
ویژگی دیگر
$[[ $ me = $ you ]] # Fine. $[[ I am$ me = I am$ you ]] # Not fine!-bash: conditional binary operator expected -bash: syntax error near `am'
در این حالت، نیازی به نقلقولی کردن
$[[ "I am$ me "= "I am$ you "]]
همچنین، تفاوت ظریف زیرکانهای بین نقلقولی کردن و نکردن سمت راست مقایسه در
$foo = [a-z]*name = lhunath $[[ $ name = $ foo ]] && echo "Name$ name matches pattern$ foo "Name lhunath matches pattern [a-z]* $[[ $ name = "$ foo "]] || echo "Name$ name is not equal to the string$ foo "Name lhunath is not equal to the string [a-z]*
بررسی اول کنترل میکند که آیا
یادآوری: همواره اگر اطمینان ندارید نقلقولی کنید. اگر
میتوانید چندین دستور
$name = lhunath $if [[ $ name = "George"]] >then echo "Bonjour,$ name " >elif [[ $ name = "Hans"]] >then echo "Goeie dag,$ name " >elif [[ $ name = "Jack"]] >then echo "Good day,$ name " >else > echo "You're not George, Hans or Jack. Who the hell are you,$ name ?" >fi
حال که درک مناسبی از مسائلی که با نقلقولها ممکن است ایجاد شود به دست آوردهاید، بیایید به سایر ویژگیهایی که [ و
بررسیهایی که با [ ( که به عنوان test نیزشناخته میشود) پشتیبانی میشود:
-e FILE: اگر فایل موجود باشد صحیح است.
-f FILE: اگر فایل موجود معمولی باشد صحیح است.
-d FILE: اگر فایل یک دایرکتوری باشد صحیح است.
-h FILE: اگر فایل یک پیوند نمادین باشد صحیح است.
-r FILE: اگر فایل برای شما قابل خواندن باشد صحیح است.
-s FILE: اگر فایل موجود باشد وتهی نباشد صحیح است.
-t FD : اگر FD(توصیفگر فایل) در یک ترمینال باز شده باشد صحیح است.
-w FILE: اگر فایل برای شما قابل نوشتن باشد صحیح است.
-x FILE: اگر فایل برای شما قابل اجرا باشد صحیح است.
-O FILE: اگر فایل به طور مؤثر در مالکیت شما باشد صحیح است.
-G FILE: اگر فایل به طور مؤثر در مالکیت گروه شما باشد صحیح است.
FILE -nt FILE: اگر فایل اول جدیدتر از فایل دوم باشد صحیح است.
FILE -ot FILE: اگر فایل اول قدیمیتر از فایل دوم باشد صحیح است.
-z STRING: اگر رشته تهی باشد(طول آن صفر باشد) صحیح است.
-n STRING: اگر رشته تهی نباشد(طول آن صفر نباشد) صحیح است.
STRING = STRING: اگر رشته اول از هر نظر مانند دومی باشد صحیح است.
STRING != STRING: اگر رشته اول دقیقاً مانند رشته دوم نباشد صحیح است.
STRING < STRING:اگر در مرتبسازی رشته اول قبل از دومی قرار میگیرد صحیح است.
STRING > STRING: اگر رشته اول در مرتبسازی بعد از رشته دوم قرارمیگیرد صحیح است.
EXPR -a EXPR: اگر هر دوعبارت صحیح باشندصحیح است(and منطقی).
EXPR -o EXPR: اگر هر یک از دو عبارت صحیح باشد صحیح است(or منطقی).
! EXPR: نتیجه عبارت را معکوس میکند( NOTمنطقی).
INT -eq INT: اگر هر دو عدد صحیح دقیقاً برابر باشند صحیح است.
INT -ne INT: اگر هر دو عدد صحیح دقیقاً برابر نباشند، صحیح است.
INT -lt INT: اگر عدد صحیح اولی کوچکتر از دومی باشد صحیح است.
INT -gt INT: اگر عدد صحیح اولی از دومی بزرگتر باشد صحیح است.
INT -le INT: اگر عدد صحیح اولی کوچکتر یا مساوی دومی باشد صحیح است.
INT -ge INT: اگر عدد صحیح اولی بزرگتر یا مساوی دومی باشد صحیح است.
بررسیهای اضافی که فقط توسط
STRING = (or ==) PATTERN: مانند [ (یا test) مقایسه نمیکند، بلکه انطباق الگو انجام میشود. اگر رشته با الگوی جانشین منطبق گردد، صحیح است.
STRING =~ REGEX: اگر رشته با الگوی regex(عبارت منظم)تطبیق کند، صحیح است.
( EXPR ): پرانتزها میتوانند برای تغییر اولویت ارزیابیها به کار بروند.
EXPR && EXPR: خیلی مشابه عملگر
EXPR || EXPR: خیلی مشابه عملگر
چند مثال؟ حتماً:
$ test-e /etc/X11/xorg.conf&& echo 'Your Xorg is configured!'Your Xorg is configured! $ test-n "$ HOME "&& echo 'Your homedir is set!'Your homedir is set! $[[ boar!= bear]] && echo "Boars aren't bears."Boars aren't bears! $[[ boar!= b? ar]] && echo "Boars don't look like bears." $ $[[ $ DISPLAY ]] && echo "Your DISPLAY variable is not empty, you probably have Xorg running."Your DISPLAY variable is not empty, you probably have Xorg running. $[[ ! $ DISPLAY ]] && echo "Your DISPLAY variable is not not empty, you probably don't have Xorg running." $
تکرارمفید:
هنگامی که یک اسکریپت BASH ایجاد میکنید، همیشه باید از
وقتی یک اسکریپت پوسته مینویسید، که پس از اتمام ممکن است در محیطی که BASH در دسترس نباشد، به کار برود، باید از [ استفاده کنید، به دلیل آنکه به مراتب قابل حملتر میباشد. ( در حالیکه در BASH و برخی پوستههای دیگر، [ یک دستور داخلی است، به صورت یک برنامه خارجی نیز به خوبی در دسترس میباشد، یعنی به عنوان شناسه مثلاً exec و xargs کار خواهد کرد.)
هرگز از
if [ "$ food "= apple ]&& [ "$ drink "= tea ]; then echo "The meal is acceptable."fi
در پرسش و پاسخهای رایج:
چگونه میتوانم عبارتها را گروهبندی کنم، مثل (a
چطور میتوانم تعیین نمایم که آیا یک متغیر شامل یک زیر رشته هست؟
چگونه میتوانم بگویم که یک متغیر آیا محتوی یک عدد معتبر هست؟