ایستگاه های کاری آنلاین OnWorks Linux و Windows

لوگو

میزبانی آنلاین رایگان برای ایستگاه های کاری

<قبلی | فهرست | بعدی>

IFS

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

ما می توانیم مقدار را تنظیم کنیم IFS برای کنترل جداسازی فیلدهای ورودی به خواندن. به عنوان مثال / etc / passwd فایل حاوی خطوط داده ای است که از کاراکتر کولون به عنوان جداکننده فیلد استفاده می کنند. با تغییر مقدار IFS به یک کولون تک، می توانیم استفاده کنیم خواندن برای وارد کردن محتویات / etc / passwd و فیلدها را با موفقیت به متغیرهای مختلف جدا کنید. در اینجا ما یک اسکریپت داریم که دقیقاً این کار را انجام می دهد:



#! / bin / bash

# read-ifs: خواندن فیلدها از یک فایل FILE=/etc/passwd

#! / bin / bash

# read-ifs: خواندن فیلدها از یک فایل FILE=/etc/passwd


read -p "نام کاربری را وارد کنید > " user_name file_info=$(grep "^$user_name:" $FILE) if [ -n "$file_info" ]; سپس

IFS=":" read user pw uid gid name shell home <<< "$file_info" echo "User = '$user'"

echo "UID = '$uid'"

echo "GID = '$gid'" echo "Full Name = '$name'" echo "Home Dir. = '$home'" echo "Shell = '$shell'"

دیگر

echo "هیچ کاربری '$user_name' وجود ندارد" >&2 خروج 1

fi

read -p "نام کاربری را وارد کنید > " user_name file_info=$(grep "^$user_name:" $FILE) if [ -n "$file_info" ]; سپس

IFS=":" read user pw uid gid name shell home <<< "$file_info" echo "User = '$user'"

echo "UID = '$uid'"

echo "GID = '$gid'" echo "Full Name = '$name'" echo "Home Dir. = '$home'" echo "Shell = '$shell'"

دیگر

echo "هیچ کاربری '$user_name' وجود ندارد" >&2 خروج 1

fi


این اسکریپت از کاربر می‌خواهد نام کاربری یک حساب کاربری را در سیستم وارد کند، سپس فیلدهای مختلف موجود در رکورد کاربر را نمایش می‌دهد. / etc / passwd فایل. فیلمنامه شامل دو خط جالب است. اولی این است:

file_info=$(grep "^$user_name:" $FILE)

این خط نتایج a را اختصاص می دهد grep استفاده دستور به متغیر اطلاعات فایل. عبارت منظم استفاده شده توسط grep استفاده اطمینان می دهد که نام کاربری تنها با یک خط در متن مطابقت دارد / etc / passwd فایل.

دومین خط جالب این است:

IFS=":" read user pw uid gid name shell home <<< "$file_info"

خط از سه بخش تشکیل شده است: یک انتساب متغیر، a خواندن دستور با لیستی از نام متغیرها به عنوان آرگومان، و یک عملگر تغییر مسیر جدید عجیب و غریب. ابتدا به انتساب متغیر نگاه می کنیم.

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

OLD_IFS="$IFS" IFS=":"

کاربر pw uid gid name shell home <<< "$file_info" IFS="$OLD_IFS"

جایی که ما مقدار آن را ذخیره می کنیم IFS، یک مقدار جدید اختصاص دهید، خواندن دستور دهید و سپس بازیابی کنید IFS به ارزش اصلی خود به وضوح، قرار دادن تخصیص متغیر در مقابل


دستور روشی مختصرتر برای انجام همان کار است.

La << عملگر a را نشان می دهد اینجا رشته. رشته here مانند سند here است، فقط کوتاهتر است و از یک رشته تشکیل شده است. در مثال ما، خط داده از

فایل /etc/passwd به ورودی استاندارد دستور خواندن وارد می شود. ممکن است برنده شویم -

چرا این روش نسبتاً مایل به جای:

echo "$file_info" | IFS=":" user pw uid gid name shell home را بخوانید

تصویر

خب دلیل داره...


شما نمی توانید پایپ بخوانید

در حالی که خواندن دستور معمولاً ورودی را از ورودی استاندارد می گیرد، شما نمی توانید این کار را انجام دهید:

پژواک "فو" | خواندن

ما انتظار داریم که این کار کند، اما اینطور نیست. فرمان موفقیت آمیز به نظر می رسد اما پاسخ متغیر همیشه خالی خواهد بود. چرا این هست؟

توضیح مربوط به نحوه برخورد پوسته با خطوط لوله است. که در بر هم زدن (و پوسته های دیگر مانند shخطوط لوله ایجاد می کند زیر پوسته ها. اینها کپی هایی از پوسته و محیط آن هستند که برای اجرای دستور در خط لوله استفاده می شوند. در مثال بالا ما، خواندن در زیر پوسته اجرا می شود.

پوسته‌های فرعی در سیستم‌های شبه یونیکس، کپی‌هایی از محیط ایجاد می‌کنند تا فرآیندها در حین اجرا از آن‌ها استفاده کنند. هنگامی که فرآیندها به پایان می رسد، کپی محیط از بین می رود. این به این معنی است که یک زیر پوسته هرگز نمی تواند محیط فرآیند والد خود را تغییر دهد. خواندن متغیرهایی را تخصیص می دهد که سپس به بخشی از محیط تبدیل می شوند. در مثال بالا، خواندن مقدار "foo" را به متغیر اختصاص می دهد پاسخ در محیط زیرشل خود، اما زمانی که فرمان خارج می شود، زیر پوسته و محیط آن از بین می رود و اثر انتساب از بین می رود.

استفاده از رشته‌ها در اینجا یکی از راه‌های حل این رفتار است. روش دیگری در فصل 36 مورد بحث قرار گرفته است.


برترین سیستم عامل Cloud Computing در OnWorks: