از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
چگونه از $IFS در Bash استفاده کنیم؟
سرفصلهای مطلب
IFS مخفف Internal Field Separator است که یک متغیر محیطی در پوسته برای تعیین جداکننده است. $IFS روش کلمات را مشخص می کند روی خط فرمان محدود شده اند. بهطور پیشفرض، جداکنندههای فیلد (IFS) فضا، برگه و خط جدید هستند، اما میتوانیم این را در اسکریپت خود تغییر دهیم تا با الزامات مطابقت داشته باشد. بیشتر برای حلقه ها برای دستکاری عناصر موجود در لیست مشخص شده استفاده می شود. ما از متغیر $IFS در اسکریپت Bash خود برای تقسیم رشته استفاده می کنیم زیرا Bash دارای مکانیزم داخلی برای تقسیم رشته نیست.
مثال 1: اسکریپت Bash بدون اپراتور $IFS
اسکریپت Bash زیر را در نظر بگیرید که در آن عناصر با فضای خالی جدا شده اند. در اینجا، ما از عملگر $IFS برای دیدن خروجی اسکریپت معمولی Bash استفاده نمی کنیم. ما فایل “Bash.sh” را ایجاد می کنیم و سپس آن را باز می کنیم تا برنامه چاپ رشته را بنویسیم روی پوسته Bash ما با اعلان متغیری با عنوان “$MySentence” شروع می کنیم و این متغیر را با رشته طولانی مشخص می کنیم. ما کلمات مختلفی در رشته داریم که با فاصله تقسیم می شوند. سپس، حلقه foreach را برای چاپ هر کلمه از رشته “$MySentence” فراخوانی می کنیم. حلقه foreach با شی “MyWords” تنظیم می شود که کلمه تکرار شده را از رشته نگه می دارد. پس از آن، کلمات تکرار شده از رشته را با دستور echo که بین دستور do و done قرار می گیرد، بازتاب می دهیم.
جمله من=“Bash یک برنامه نویسی موثر است”
برای MyWords که در $MySentence
انجام دادن
اکو “$MyWords“
انجام شده
باز کن terminal با کلید میانبر «Ctrl+Alt+T» و کامپایل «bashفایل .sh با دستور Bash. کلمات نمایش داده شده در پوسته در یک خط جداگانه قرار دارند زیرا فاصله، زبانه ها و خط جدید جداکننده فیلد در Bash در نظر گرفته می شوند.
مثال 2: اسکریپت Bash با اپراتور $IFS
کلمات را در رشته مشخص شده بدون استفاده از عملگر $IFS جدا می کنیم. می توانیم از عملگر $IFS با کاراکتر مورد نظر استفاده کنیم. اگر IFS پیشفرض را تغییر دهیم، این یک استراتژی عاقلانه است که IFS قدیمی را در یک متغیر ذخیره کنیم. هنگامی که وظایف مورد نیاز خود را کامل کردیم، میتوانیم کاراکتر اصلی را به IFS اختصاص دهیم. بیایید اسکریپت Bash را داشته باشیم که در آن از عملگر $IFS برای جداسازی کلمات استفاده می شود.
در اینجا، رشته را به عنوان نام افراد مشخص می کنیم که با دو نقطه کاراکتر “:” در داخل متغیر “Persons” از هم جدا می شوند. سپس، مقدار اصلی IFS را در ویژگی “Pre_ifs” ذخیره می کنیم. در مرحله بعد، متغیر IFS را در جایی که کولون “:” به عنوان جداکننده تنظیم شده است، اعلام می کنیم. متغیر IFS به عنوان نشانه کلمه استفاده می شود که برای حلقه for استفاده می شود. ما از حلقه foreach برای عبور از رشته متغیر “Persons” به صورت تقسیم استفاده می کنیم و تمام عناصر رشته را به شی “Per” حلقه for-each منتقل می کنیم. سپس از دستور echo در دستورات do و done برای نمایش رشته های جدا شده استفاده می کنیم.
افراد=الکس:توماس:کایل:جنی
Pre_ifs=“$IFS“
IFS=“:”
برای مطابق که در $Persons
انجام دادن
اکو نام اشخاص هستند $ در هر
انجام شده
آن را با فایل اسکریپت Bash در کامپایل کنید terminal برای دیدن خروجی استفاده از عملگر IFS. هنگامی که فایل Bash عملگر IFS اجرا می شود، هر رشته را به فرمت زیر جدا می کند:
مثال 3: Bash اسکریپت با اپراتور $IFS برای نمایش نام کاربری از فایل
اکنون از عملگر $IFS در اسکریپت Bash برای نمایش نام کاربران از فایل “/etc/passwd” استفاده می کنیم. ما در اینجا از عملگر $IFS استفاده می کنیم که هر نام کاربری را در پوسته جدا می کند. اسکریپت Bash زیر با اعلان متغیر “IFS” شروع می شود که با کاراکتر “$’\n” و یک کولون “:” تنظیم شده است. کاراکتر $’\n’ یک کاراکتر خط جدید است که برای دنباله فرار استفاده می شود. نام های کاربری از طریق IFS ارائه شده جدا می شوند.
پس از این، یک متغیر “x” داریم که مقدار آن “1” است. سپس، از دستور cat با فایل “/etc/passwd” استفاده می کنیم که نام کاربری را به شی “user” حلقه foreach ارسال می کند تا روی همه کاربران فایل “/etc/passwd” تکرار شود. دستورات “do” و “done” با دستورات شرطی “if” تودرتو برای بازتاب کاربران مشخص می شوند.
ایکس=1
برای کاربر که در `گربه /و غیره/passwd`
انجام دادن
اگر [ $x -eq 1 ]
سپس
اکو $user
فی
اگر [ $x -eq 7 ]
سپس
ایکس=1
دیگر
ایکس=$((x+1))
فی
انجام شده
ما اسکریپت Bash را اجرا می کنیم روی به شرح زیر terminal صفحهای که به کاربران «/etc/passwd» توسط جداکننده فیلد مشخص شده خروجی میدهد:
مثال 4: اسکریپت Bash خط فرمان با $IFS
IFS یک متغیر پوسته خاص است، بنابراین می توانیم مستقیماً از آن در خط فرمان استفاده کنیم. در اینجا، ما یک میانبر برای استفاده از عملگر IFS داریم. به جای ایجاد یک فایل اسکریپت Bash جداگانه، ما آن را باز می کنیم terminal و متغیر “IFS” را تعریف کنید. متغیر “IFS” با خط فاصله “-” تنظیم می شود. سپس، یک رشته “Hello-Geeks” را تکرار می کنیم که با خط فاصله جداکننده فیلد “-” از هم جدا شده است. سپس از دستور read برای تعریف متغیرهای “var1” و “var2” استفاده می کنیم و این متغیرها را به طور جداگانه اکو می کنیم.
اکو “سلام گیک ها!” | (خواندن var1 var2; اکو $var1; اکو $var2)
خروجی رشته Hello و رشته “Geeks” را به طور جداگانه بازیابی می کند. از این رو، $IFS جداکننده ها را به صورت جداگانه می پذیرد.
مثال 5: تقسیم رشته تعریف شده توسط کاربر در اسکریپت Bash با IFS
ما از عملگر $IFS در اسکریپت قبلی Bash برای نشان دادن عملکرد استفاده کردیم. اکنون، از یک عملگر IFS برای تنظیم جداکننده برای رشته کلماتی که توسط کاربر در terminal. دستور خواندن را با پرچم “-p” می دهیم. این دستور عبارت Enter the string with space را چاپ می کند. سپس رشته وارد شده در متغیر “StringIs” مقداردهی اولیه می شود. عملگر IFs با جداکننده فاصله تنظیم شده است تا رشته ها را تقسیم کند.
در مرحله بعد، دستور “read -ra ADDR” را داریم که “$StrinIS” را به عنوان آرایه ای از توکن ها می خواند که توسط IFS تقسیم می شوند. گزینه “-r” مشخص می کند که اسلش “\” یک کاراکتر فرار نیست، بلکه یک کاراکتر است. گزینه “-a” مشخص می کند که کلمات با $IFS اختصاص داده شده به شاخص ترتیبی آرایه که از صفر شروع می شود از هم جدا شوند. پس از آن، با عبور از حلقه foreach به عناصر رشته ای آرایه دسترسی پیدا می کنیم.
خواندن -پ “رشته را با فاصله وارد کنید:” StringIS
IFS=“”
خواندن -ra ADDR <<<“$StringIS“
برای من که در “${ADDR[@]}“;
انجام دادن
اکو “$i“
انجام شده
رشته ای که توسط کاربر وارد می شود شامل فضاهای خالی است که اجرای آن به صورت زیر به دست می آید:
نتیجه
این سرمقاله روش جداسازی توکن در Bash را از طریق $IFS با پیاده سازی اسکریپت های Bash کشف کرد. ما همچنین از $IFS در خط فرمان برای تقسیم رشته استفاده کردیم. این یک راه بسیار ساده و کوتاه برای انجام جداسازی رشته است. اگرچه، پوسته از هر کاراکتر IFS به عنوان جداکننده استفاده می کند و یافته های تکرارهای دیگر را به کلمات تقسیم می کند.
لطفا در صورت وجود مشکل در متن یا مفهوم نبودن توضیحات، از طریق دکمه گزارش نوشتار یا درج نظر روی این مطلب ما را از جزییات مشکل مشاهده شده مطلع کنید تا به آن رسیدگی کنیم
زمان انتشار: 1402-12-29 14:58:02