متغیرها جایی برای نگه داشتن داده هستند. Bash دو نوع داده دارد: رشتهها و آرایهها. بعداً دربارهی آرایهها صحبت میکنیم.
به یک متغیر اینگونه مقدار میدهید
name="value"
مهم: دور علامت تساوی نباید هیچ فاصلهای باشد!
وقتی فاصله وجود داشته باشد، مثل این مثال،
x = 10
bash دستور x را با دو آرگومانِ = و 10 فراخوانی میکند!
به متغیرها میتوان پارامتر هم گفت. در این سند، این دو اصطلاح بهجای یکدیگر به کار میروند.
برخی از پارامترهای مهمی که bash از آنها استفاده میکند یا آنها را تعیین میکند عبارتاند از:
PATH: فهرستی از پوشهها که با دو نقطه از هم جدا شدهاند و برای یافتن دستورهای بیرونی به کار میرود.IFS: «جداکنندهی فیلد داخلی».
در ادامه میبینیم چطور از آن استفاده میشود.PWD: پوشهی کاری فعلی شما.
مقدار آن همان خروجی دستور pwd است.RANDOM: یک عدد صحیح شبهتصادفی بین ۰ و ۳۲۷۶۷.BASH_VERSION: رشتهی نسخهی نمونهی در حال اجرای bash.اسم یک متغیر از حروف بزرگ، حروف کوچک، اعداد و زیرخط تشکیل میشود. و نمیتواند با یک عدد شروع شود.
مقدار یک پارامتر را با نحوهی نگارش $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!"
گسترشهای پارامتر جالب دیگری هم وجود دارد: استخراج یک زیررشته، گرفتن طول رشته، قرار دادن یک مقدار پیشفرض، حذف متن از ابتدا یا انتهای مقدار و موارد دیگر. در کتابچهی راهنما دربارهی آنها بخوانید.