تا به حال، اسکریپتهای ما فعل و انفعالی نبودهاند. یعنی، آنها به هیچ ورودی از کاربر نیاز نداشتند. در این درس، مشاهده خواهیم نمود چگونه اسکریپتهای شما میتوانند پرسشها را بپرسند، و پاسخها را به دست آورده استفاده کنند.
برای دریافت ورودی صفحهکلید، از فرمان read استفاده کنید. فرمان read ورودی از صفحهکلید را دریافت میکند و به یک متغیر تخصیص میدهد. این هم یک مثال:
#!/bin/bash echo -n "Enter some text > " read text echo "You entered: $text"
به طوری که مشاهده میکنید، در سطر 3 ما یک اعلان نمایش دادیم. توجه کنید که "
سپس، فرمان read را با "text" به عنوان شناسهاش احضار کردیم. آنچه این سطر انجام میدهد منتظر ماندن برای آنکه کاربر چیزی تایپ کند که با carriage return (کلید اینتر) دنبال شود و سپس تخصیص دادن آنچه تایپ گردیده به متغیر text است.
این هم اسکریپت در عمل است:
[me@linuxbox me]$ read_demo.bash
Enter some text > this is some text
You entered: this is some
text
اگر شما به فرمان read نام یک متغیر را برای تخصیص ورودیاش ندهید، از یک متغیر محیط به نام REPLY استفاده میکند.
فرمان read چند گزینه خط فرمان نیز قبول میکند. دو مورد از جالبترین آنها
#!/bin/bash echo -n "Hurry up and type something! > " if read -t 3 response; then echo "Great, you made it in time!" else echo "Sorry, you are too slow!" fi
گزینه
چون ما روی کامپیوتر کار میکنیم، طبیعی است که انتظار داشته باشیم بتواند برخی محاسبات ساده را انجام بدهد. پوسته ویژگیهایی برای
یک عدد صحیح چیست؟ به معنای تمام اعداد کاملی مانند 1, 2, 458, -2859 است. به معنای اعداد کسری مانند 0.5, .333, یا 3.1415 نیست. اگر شما باید به اعداد کسری رسیدگی کنید، برنامه جداگانهای به نام bc وجود دارد که یک زبان محاسب با دقت اختیاری را ارایه میکند. این برنامه میتواند در اسکریپتهای پوسته به کار برود، اما فراتر از حوزه این آموزش است.
بیایید فرض کنیم شما میخواهید خط فرمان را به عنوان یک ماشین حساب ابتدایی به کار ببرید. میتوانید کاری مانند این را انجام بدهید:
[me@linuxbox me]$ echo $((2+2))
چنانکه مشاهده میکنید، موقعی که یک عبارت حسابی را با پرانتزهای دوتایی احاطه میکنید، پوسته بسط حسابی انجام خواهد داد.
توجه نمایید که فضاهای سفید صرفنظر میشوند:
[me@linuxbox me]$ echo $((2+2))
4
[me@linuxbox me]$ echo $(( 2+2 ))
4
[me@linuxbox me]$ echo $(( 2 + 2 ))
4
پوسته میتواند یک طیف عملیات حسابی متعارفی (و نه غیر متعارفی) را انجام بدهد. این هم یک مثال:
#!/bin/bash first_num=0 second_num=0 echo -n "Enter the first number --> " read first_num echo -n "Enter the second number -> " read second_num echo "first number + second number = $((first_num + second_num))" echo "first number - second number = $((first_num - second_num))" echo "first number * second number = $((first_num * second_num))" echo "first number / second number = $((first_num / second_num))" echo "first number % second number = $((first_num % second_num))" echo "first number raised to the" echo "power of the second number = $((first_num ** second_num))"
ملاحظه کنید چطور "
این برنامه را امتحان کنید و دقت نمایید با تقسیم چگونه رفتار میکند ( به خاطر بیاورید که این تقسیمِ صحیح است) و با اعداد طویل چطور رفتار میکند. اعدادی که خیلی بزرگ باشند سرریز میکنند مانند کیلومترشمار در یک اتومبیل موقعی که شما از تعداد کیلومتری که برای شمارش آن تنظیم گردیده تجاوز میکنید. دوباره شروع میکند اما بواسطه چگونگی بیان کردن اعداد صحیح در حافظه، ابتدا تمام اعداد منفی را مرور میکند. تقسیم بر صفر (که از نظر ریاضی نامعتبر است) موجب یک خطا میشود.
من اطمینان دارم که شما چهار عملیات نخست به عنوان جمع، تفریق، ضرب و تقسیم را تشخیص میدهید، اما ممکن است آن مورد پنجم ناشناخته باشد. نماد "
#!/bin/bash number=0 echo -n "Enter a number > " read number echo "Number is $number" if [ $((number % 2)) -eq 0 ]; then echo "Number is even" else echo "Number is odd" fi
یا، در این برنامه که تعداد ثانیههای دلخواه را به ساعت و دقیقه قالببندی میکند:
#!/bin/bash seconds=0 echo -n "Enter number of seconds > " read seconds hours=$((seconds / 3600)) seconds=$((seconds % 3600)) minutes=$((seconds / 60)) seconds=$((seconds % 60)) echo "$hours hour(s) $minutes minute(s) $seconds second(s)"