مت

متغیر در Bash

{one: "۱ تمرین", other: "%{count} تمرین"}

درباره‌ی متغیر

متغیرها

متغیرها جایی برای نگه داشتن داده هستند. Bash دو نوع داده دارد: رشته‌ها و آرایه‌ها. بعداً درباره‌ی آرایه‌ها صحبت می‌کنیم.

به یک متغیر این‌گونه مقدار می‌دهید

name="value"
Note

مهم: دور علامت تساوی نباید هیچ فاصله‌ای باشد!

وقتی فاصله وجود داشته باشد، مثل این مثال،

x = 10

bash دستور x را با دو آرگومانِ = و 10 فراخوانی می‌کند!

به متغیرها می‌توان پارامتر هم گفت. در این سند، این دو اصطلاح به‌جای یکدیگر به کار می‌روند.

برخی از پارامترهای مهمی که bash از آن‌ها استفاده می‌کند یا آن‌ها را تعیین می‌کند عبارت‌اند از:

  • PATH: فهرستی از پوشه‌ها که با دو نقطه از هم جدا شده‌اند و برای یافتن دستورهای بیرونی به کار می‌رود.
  • IFS: «جداکننده‌ی فیلد داخلی». در ادامه می‌بینیم چطور از آن استفاده می‌شود.
  • PWD: پوشه‌ی کاری فعلی شما. مقدار آن همان خروجی دستور pwd است.
  • RANDOM: یک عدد صحیح شبه‌تصادفی بین ۰ و ۳۲۷۶۷.
  • BASH_VERSION: رشته‌ی نسخه‌ی نمونه‌ی در حال اجرای bash.

اسم‌های متغیر

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

Caution

بهترین کار این است که از اسم‌های تمام‌حروف‌بزرگ برای متغیرها پرهیز کنید. شل از این قرارداد برای پارامترهای خودش استفاده می‌کند و شما نمی‌خواهید به‌طور تصادفی پارامترهای شل را که معنای ویژه‌ای دارند بازنویسی کنید. برای مثال: 1، 2، 3

گسترش پارامتر

مقدار یک پارامتر را با نحوه‌ی نگارش $varname به دست می‌آورید.

x=10
echo "The value of x is $x"

برای اینکه اسم متغیر با متن اطرافش اشتباه گرفته نشود، می‌توانید اسم متغیر را داخل آکولاد بگذارید. برای مثال، برای چاپ رشته‌ی 10x10

echo "${x}x$x"
# or
echo "${x}x${x}"

برخی راهنماهای سبک توصیه می‌کنند برای خوانایی و/یا یکدستی، در بیشتر موارد از آکولاد استفاده کنید.

پارامترهای موقعیتی

همان‌طور که در درس دستورها و آرگومان‌ها گفتیم، دستورها می‌توانند آرگومان بگیرند. اسکریپت‌های bash هم از این قاعده مستثنا نیستند. به آرگومان‌های نمونه‌ی فعلی bash، پارامترهای موقعیتی می‌گویند. می‌توان آن‌ها را با این پارامترهای ویژه به دست آورد:

  • $1: اولین پارامتر موقعیتی
  • $2 ... $9: پارامترهای بعدی
  • ${10} ...: اعداد دورقمی به آکولاد نیاز دارند.
  • $0: اسم اسکریپت فعلی.

آرگومان‌های یک تابع شل هم پارامترهای موقعیتی هستند و دقیقاً همین‌طور مدیریت می‌شوند. در درسی بعدی درباره‌ی توابع بیشتر خواهیم دید.

پارامترهای موقعیتی ویژه

چند پارامتر ویژه وجود دارد که به شما کمک می‌کنند با پارامترهای موقعیتی کار کنید.

  • $# به تعداد پارامترهای موقعیتی گسترش می‌یابد.
  • "$@" به فهرست همه‌ی پارامترهای موقعیتی گسترش می‌یابد، هر کدام به‌صورت یک واژه‌ی جداگانه.
  • "$*" به یک رشته‌ی واحد گسترش می‌یابد که همه‌ی پارامترهای موقعیتی با یک نویسه به هم چسبیده‌اند.
    • نویسه‌ی اتصال، اولین نویسه‌ی متغیر $IFS است که به‌طور پیش‌فرض فاصله است.

"$@" امن‌ترین راه برای فرستادن پارامترهای موقعیتی به یک دستور دیگر است، در حالی که نقل‌قول‌شان به‌شکل ایمن حفظ می‌شود. همچنین برای پیمایش پارامترهای موقعیتی هم از همین استفاده خواهید کرد:

for arg in "$@"; do
    do_something_with "$arg"
done

در عمل، از "$@" بیشتر از "$*" استفاده می‌شود.

جانشینی دستور

یکی از کارهایی که در اسکریپت‌های bash بسیار زیاد انجام می‌دهید، گرفتن خروجی یک دستور و ذخیره‌ی آن در یک متغیر است. برای این کار از جانشینی دستور استفاده می‌کنید.

var=$(command)

برای مثال، برای بزرگ کردن حروف یک رشته، می‌توانید این کار را بکنید:

text="Hello world!"
uppercase=$(echo "$text" | tr '[:lower:]' '[:upper:]')
echo "$uppercase"
# => HELLO WORLD!

بیشتر درباره‌ی گسترش پارامتر

Bash امکانات درون‌ساخت زیادی برای دست‌کاری متغیرها و رشته‌ها دارد تا لازم نباشد دستورهای بیرونی را فراخوانی کنید.

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

    echo "${text^^}"
    

    به همین ترتیب، ${text,,} مقدار را کوچک می‌کند.

  • ارائه‌ی یک مقدار پیش‌فرض در صورتی که متغیر خالی باشد.

    default="nothing here"
    result=""
    echo "${result:-$default}"
    # => nothing here
    
  • جست‌وجو و جایگزینی.

    text="Hello world!"
    echo "${text//[aeiou]/X}"
    # => HXllX wXrld!"
    

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

ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود