سرفصل‌های آموزشی
آموزش لینوکس
کار با String در اسکریپت‌نویسی لینوکس

کار با String در اسکریپت‌نویسی لینوکس

به‌طورکلی، منظور از String (استرینگ یا رشته) مجموعه‌ای از کاراکترهایی است که می‌توانند شامل حروف، اعداد، علائم خاص و … باشند؛ به‌‌طور مثال، مواردی نظیر abcde ،123 ،abcde 123 ،abcde-123 و abcde=%123& همگی استرینگ محسوب می‌شوند.

به‌منظور مقایسه، مرتب‌سازی (سورت کردن) و همچنین یافتن طول یک استرینگ اپراتورهایی در لینوکس درنظر گرفته شده که عبارتند از:

اپراتور کاربرد [[ string1 > string2 ]] ترتیب ۲ استرینگ string1 و string2 را با یکدیگر مقایسه می‌کند. [[ string1 == string2 ]] کاراکترهای string1 را با کاراکترهای string2 مقایسه می‌کند. myLen1=${#string1} طول string1 را در متغیری تحت‌عنوان myLen1 ذخیره می‌سازد.

به‌منظور روشن‌تر شدن نحوهٔ به‌ کارگیری اپراتورهای فوق، فایلی می‌سازیم تحت‌عنوان string.sh و کدهای زیر را داخل آن می‌نویسیم:

#! /bin/bash
if [ $1 == $2 ] 
then
    echo "The first string, $1, is the same as the second string, $2."
else 
    echo "The first string, $1, is not the same as the second string, $2."
fi

همان‌طور که در کد فوق مشخص است، در خط اول مسیر مفسر بش را داده سپس در خط دوم از یک دستور شرطی (if) استفاده کرده‌‌ایم بدین شکل که ۲ پارامتر ورودی تحت‌ عناوین 1$ و 2$ را گرفته و آن‌ها را با یکدیگر مقایسه می‌کند. اگر مقادیر ورودی دقیقاً یکسان بودند، دستور قرار گرفته پس از کلیدواژهٔ then چاپ می‌شود و در غیر این صورت، دستور قرار گرفته پس از else و درنهایت هم با دستور fi این اسکریپت به‌ پایان می‌رسد.

پیش از هرچیز، بااستفاده از دستور chmod +x string.sh می‌بایست این برنامه‌ را قابل‌اجرا کنیم؛ سپس یک‌بار کلمات Sokan و Academy را به‌عنوان پارامترهای ورودی در نظر می‌گیریم:

bash string.sh Sokan Academy
The first string, Sokan, is not the same as the second string, Academy.

همان‌طور که به‌وضوح مشخص است، دستور داخل else اجرا می‌شود. حال یک بار دیگر این برنامه را اجرا کرده و مقادیر یکسانی را به‌عنوان پارامترهای اول و دوم در نظر می‌گیریم:

bash string.sh Sokan Sokan
The first string, Sokan, is the same as the second string, Sokan.

می‌بینیم که به‌درستی دستور قرار گرفته پس از then اجرا شد. حال می‌خواهیم برنامهٔ کوچک دیگری را بنویسیم که وجود یا عدم وجود یک فایل را تست کند؛ برای این منظور، فایلی تحت‌عنوان file.sh ساخته و کدهای زیر را داخل آن می‌نویسیم:

#! /bin/bash
FILE=$1     
if [ -f $FILE ] 
then
   echo "File $FILE exists."
else
   echo "File $FILE does not exist."
fi

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

bash file.sh string.sh 
File string.sh exists.

حال اگر فایلی که وجود خارجی نداشته باشد -مثلاً string2.sh- را به‌عنوان پارامتر ورودی این برنامه درنظر بگیریم، مسلماً دستور داخل else اجرا خواهد شد.

دسترسی به اجزای یک استرینگ در بش

گاهی‌اوقات به‌جای مقایسهٔ کل یک استرینگ،‌ ما نیاز داریم تا صرفاً بخشی از آن‌را با چیز دیگری مقایسه کنیم. به‌طور مثال، برای به‌دست آوردن اولین کاراکتر یک استرینگ، می‌بایست از ساختاری همچون {string:0:1}$ استفاده نماییم که در آن ۰ که اصطلاحاً Offset نامیده می‌شود و جایی‌ است که تمایل داریم شمارش از آنجا شروع شود و ۱ تعداد کاراکترهایی است که قصد داریم از نقطهٔ Offset به بعد استخراج شوند.

برای روشن‌تر شدن این مسئله، مثالی می‌زنیم. بااستفاده از دستور export، یک به‌اصطلاح Environment Variable تحت هر عنوانی که تمایل داشته باشیم می‌سازیم:

export fullname="Behzad.Moradi"

بااستفاده از دستور export و انتخاب نامی دلخواه همچون fullname و در نظر گرفتن مقداری برای آن همچون Behzad.Moradi به‌سادگی توانستیم یک Environment Variable ایجاد کنیم. حال در ادامه قصد داریم بخش اول این نام -یعنی Behzad- را استخراج کنیم:

firstname=${fullname:0:6}

می‌بینیم که متغیر جدیدی تحت‌عنوان firstname ساخته و با در نظر گرفتن آفست ۰ سپس عدد ۶، دستور داده‌ایم که شروع شمارش کاراکترها از ابتدای استرینگ یا نقطهٔ ۰ بوده و تا ۶ کاراکتر بعد را در بر گیرد. برای چاپ کردن خروجی هم از دستور زیر استفاده می‌کنیم:

echo $firstname
Behzad

اگر هم بخواهیم در یک استرینگ، کلیهٔ کاراکترهای قرار گرفته پس از یک Dot (دات یا نقطه) را استخراج کنیم، می‌توانیم از کامند زیر استفاده کنیم:

lastname=${fullname#*.}; echo $lastname
Moradi

می‌بینیم که بخشی از مقدار متغیر fullname که پس از نقطه قرار گرفته بود -Moradi- چاپ شد.

    به خاطر داشته باشید
همان‌طور که در کامند فوق مشخص است، اگر بخواهیم بیش از ۱ دستور را در یک کامند با یکدیگر ادغام کنیم، می‌بایست پس از کامند اول یک ; قرار داده سپس کامند بعدی را بنویسیم.
online-support-icon