وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

Bash دستور خواندن

0 0
زمان لازم برای مطالعه: 4 دقیقه



Bash با تعدادی دستور داخلی ارسال می شود که می توانید از آنها استفاده کنید روی خط فرمان یا در اسکریپت های پوسته شما.

در این مقاله، ما داخلی را بررسی خواهیم کرد read فرمان

باش read ساخته شده در

read یک است bash دستور داخلی که یک خط را از ورودی استاندارد (یا یک توصیفگر فایل مشخص) می خواند و آن را به کلمات تقسیم می کند. کلمه اول به نام متغیر اول ارائه شده، کلمه دوم به نام دوم و غیره اختصاص داده می شود روی.

نحو کلی از read داخلی به شکل زیر است:

read [options] [name...]

برای مشاهده روش عملکرد دستور، a را باز کنید terminal، نوع read var1 var2، و “Enter” را بزنید. دستور منتظر می ماند تا کاربر وارد ورودی شود. دو کلمه (به عنوان مثال، Hello, World!) را تایپ کنید و دوباره “Enter” را فشار دهید.

read var1 var2Hello, World!

کلمات به متغیرهایی که به آن ارسال می شوند اختصاص داده می شوند read دستور به عنوان آرگومان استفاده کنید echo
یا printf
برای تایید آن:

echo $var1echo $var2
Hello,
World!

به جای تایپ کردن روی را terminal، می توانید ورودی استاندارد را به آن ارسال کنید read با استفاده از روش‌های دیگر مانند لوله‌کشی، اینجا رشته یا هردوک:

echo "Hello, World!" | (read var1 var2; echo -e "$var1 \n$var2")
read و echo داخل پرانتز قرار می گیرند و در همان زیر پوسته اجرا می شوند.
Hello,
World!

در اینجا یک مثال با استفاده از یک here-string و وجود دارد printf:

read -r var1 var2 <<< "Hello, World!"printf "var1: %s \nvar2: %s\n" "$var1" "$var2"
Var1: Hello, 
Var2: World! 

اگر نام متغیری ارائه نشود، کل خط به آن اختصاص داده می شود REPLY متغیر:

echo "Hello, world!" | (read; echo "$REPLY")
Hello, World!

اگر تعداد آرگومان ها (متغیرهای) ارائه شده به read دستور بزرگتر از تعداد کلمات خوانده شده از ورودی است، آخرین متغیر تمام ورودی باقیمانده را دریافت می کند:

echo "Linux is awesome." | (read var1 var2; echo -e "Var1: $var1 \nVar2: $var2")
Var1: Linux 
Var2: is awesome.

هنگامی که متغیرهای بیشتری نسبت به کلمات ارائه می شود، متغیرهای اضافی خالی تنظیم می شوند:

echo "Hello, World!" | (read var1 var2 var3; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3")
Var1: Hello, 
Var2: World! 
Var3: 

بک اسلش فرار و -r گزینه

به طور پیش فرض، read بک اسلش را به عنوان یک شخصیت فرار تعبیر می کند، که گاهی اوقات ممکن است باعث رفتار غیرمنتظره شود. برای غیرفعال کردن بک اسلش، دستور را با عبارت فراخوانی کنید -r گزینه

پیشنهاد می‌کنیم بخوانید:  شروع کار با RHEL: راهنمای مبتدیان برای مبانی لینوکس

در زیر یک مثال نشان می دهد که چگونه read هنگام فراخوانی با و بدون آن کار می کند -r گزینه:

read <<< "Hello, \tWorld!"printf %s "$REPLY"
Hello, tWorld!
read -r <<< "Hello, \tWorld!"printf %s "$REPLY"
Hello, \tWorld!

همیشه ترجیح بده read -r مگر اینکه به طور خاص به پردازش فرار نیاز داشته باشید.

تغییر جداکننده (IFS)

رفتار پیش فرض از read تقسیم خط به کلمات با استفاده از یک یا چند فاصله، تب و خط جدید به عنوان جداکننده است. برای استفاده از یک کاراکتر دیگر به عنوان جداکننده، آن را به آن اختصاص دهید IFS متغیر (Internal Field Separator).

echo "Linux:is:awesome." | (IFS=":" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux 
is 
awesome.

چه زمانی IFS روی کاراکتری غیر از فاصله یا تب تنظیم شده است، کلمات دقیقاً با یک کاراکتر از هم جدا می شوند:

echo "Linux::is:awesome." | \  (IFS=":" read -r var1 var2 var3 var4; echo -e "Var1: $var1 \nVar2: $var2 \nVar3: $var3 \nVar4: $var4")

این خط به چهار کلمه تقسیم می شود. کلمه دوم یک مقدار خالی است که بخش بین جداکننده ها را نشان می دهد. به این دلیل ایجاد شده است که ما از دو کاراکتر جداکننده در کنار یکدیگر استفاده کرده ایم(::).

Var1: Linux 
Var2:  
Var3: is 
Var4: awesome.

برای تقسیم خط می توانید از بیش از یک جداکننده استفاده کنید. هنگام تعیین چند جداکننده، کاراکترها را به IFS متغیر بدون فاصله بین آنها.

در اینجا یک مثال با استفاده از _ یک - به عنوان جداکننده:

echo 'Linux_is-awesome.' | (IFS="-_" read -r var1 var2 var3; echo -e "$var1 \n$var2 \n$var3")
Linux 
is 
awesome.

درخواست کاربر

هنگام نوشتن تعاملی bash اسکریپت ها، می توانید از read دستوری برای درخواست ورودی از کاربر.

برای تعیین یک رشته اعلان، از عبارت استفاده کنید -p گزینه درخواست قبل از چاپ چاپ می شود read اجرا می شود و شامل یک خط جدید نیست.

در اینجا یک مثال ساده است:

read -r -p "Are you sure?"

به طور کلی، شما از read فرمان در یک while
حلقه برای ترغیب کاربر به ارائه یکی از پاسخ های مورد انتظار.

پیشنهاد می‌کنیم بخوانید:  روش نصب Pip در CentOS 8

کد زیر از کاربر می خواهد سیستم را راه اندازی مجدد کند:

while true; do
    read -r -p "Do you wish to reboot the system? (Y/N): " answer
    case $answer in
        [Yy]* ) reboot; break;;
        [Nn]* ) exit;;
        * ) echo "Please answer Y or N.";;
    esac
done

اگر اسکریپت پوسته از کاربران می خواهد که اطلاعات حساس مانند رمز عبور را وارد کنند، از آن استفاده کنید -s گزینه ای که می گوید read نه به print ورودی روی را terminal (برای خاموش کردن پژواک):

read -r -s -p "Enter your password: "

کلمات را به یک آرایه اختصاص دهید

برای اختصاص دادن کلمات در یک آرایه به جای نام متغیرها، عبارت را فراخوانی کنید read فرمان با -a گزینه:

read -r -a MY_ARR <<< "Linux is awesome."

for i in "${MY_ARR[@]}"; do 
  echo "$i"
done
Linux 
is 
awesome.

زمانی که هم یک آرایه و هم نام متغیر داده می شود، همه کلمات به آرایه اختصاص داده می شوند.

گزینه Timeout

را read دستور داخلی نیز از a پشتیبانی می کند -t گزینه timeout، که زمان انتظار برای ورودی را محدود می کند.

مقدار بازه زمانی بر حسب ثانیه اندازه گیری می شود و می تواند یک عدد صحیح یا یک عدد ممیز شناور باشد (مثلاً 0.5 برای نیم ثانیه).

اگر یک خط کامل از ورودی قبل از مهلت زمانی رسید، خواندن با موفقیت انجام می شود. اگر زمان آن بدون خط کامل تمام شود، از کار می افتد (با وضعیت خروج بیشتر از 128) و هر ورودی جزئی را نادیده می گیرد.

در اینجا یک مثال اساسی است:

read -r -t 10 -p "Enter your nickname (10 seconds timeout): " nickname
if [[ $? -gt 128 ]]; then
    echo "Timeout occurred!"
    nickname="(default)"
else
    echo "Hello, $nickname!"
fi

زمانی که تایم اوت روی 0، دستور بررسی می کند که آیا ورودی فوراً در دسترس است یا خیر و در صورت وجود، موفقیت (0) را برمی گرداند. در غیر این صورت، دستور بدون انتظار شکست را برمی گرداند.

نتیجه گیری

را read فرمان یک ابزار همه کاره برای خواندن و تقسیم خطوط ورودی در اسکریپت های Bash و جلسات تعاملی است.

اگر سوال یا بازخوردی دارید، در کامنت بگذارید.

bash
terminal
برای نگارش بخشهایی از این متن ممکن است از ترجمه ماشینی یا هوش مصنوعی GPT استفاده شده باشد
لطفا در صورت وجود مشکل در متن یا مفهوم نبودن توضیحات، از طریق دکمه گزارش نوشتار یا درج نظر روی این مطلب ما را از جزییات مشکل مشاهده شده مطلع کنید تا به آن رسیدگی کنیم

زمان انتشار: 1404-12-24 17:51:08

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید