خط فرمان لینوکس

ترجمه فارسی LinuxCommand.org

خط فرمان لینوکس

ترجمه فارسی LinuxCommand.org

ورودی صفحه کلید و محاسبات

ورودی صفحه کلید و محاسبات

تا به حال، اسکریپت‌های ما فعل و انفعالی نبوده‌اند. یعنی، آنها به هیچ ورودی از کاربر نیاز نداشتند. در این درس، مشاهده خواهیم نمود چگونه اسکریپت‌های شما می‌توانند پرسشها را بپرسند، و پاسخ‌ها را به دست آورده استفاده کنند.

read

برای دریافت ورودی صفحه‌کلید، از فرمان read استفاده کنید. فرمان read ورودی از صفحه‌کلید را دریافت می‌کند و به یک متغیر تخصیص می‌دهد. این هم یک مثال:

#!/bin/bash

echo -n "Enter some text > "
read text
echo "You entered: $text" 

به طوری که مشاهده می‌کنید، در سطر 3 ما یک اعلان نمایش دادیم. توجه کنید که ‎ "-n"‎ ارایه شده به فرمان echo باعث نگاه‌داشتن اشاره‌گر در همان سطر می‌گردد، یعنی در انتهای اعلان یک تعویض سطر بیرون نمی‌دهد.

سپس، فرمان 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 چند گزینه خط فرمان نیز قبول می‌کند. دو مورد از جالب‌ترین آنها ‎-t‎ و ‎-s‎ هستند. گزینه ‎-t‎ که با یک تعداد ثانیه دنبال می‌شود یک زمان انتظار خودکار برای فرمان read فراهم می‌کند. این به معنای آن است که فرمان read اگر پس از تعداد ثانیه‌های مشخص شده پاسخی از کاربر دریافت نکرده باشد منصرف می‌شود. این گزینه در موردی می‌تواند به کار برود که یک اسکریپت حتی اگر کاربر به اعلان‌ها جواب ندهد باید (شاید با یک پاسخ ذخیره شده پیش‌فرض) ادامه بدهد. این هم گزینه ‎-t‎ در عمل:

#!/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 

گزینه ‎-s‎ باعث می‌گردد آنچه کاربر تایپ می‌کند نمایش داده نشود. این برای موقعی که شما کلمه عبور یا سایر اطلاعات محرمانه را از کاربر طلب می‌کنید مفید است.

محاسبات

چون ما روی کامپیوتر کار می‌کنیم، طبیعی است که انتظار داشته باشیم بتواند برخی محاسبات ساده را انجام بدهد. پوسته ویژگی‌هایی برای محاسبات صحیح فراهم می‌کند.

یک عدد صحیح چیست؟ به معنای تمام اعداد کاملی مانند ‎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))"
       

ملاحظه کنید چطور ‎"$"‎ مقدم برای رجوع به متغیرهای داخل عبارت حسابی مانند ‎"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)"