فصل 4. معرفی متغیرها و پارامترها

4.1- جایگزینی متغیر

نام یک متغیر، جای‌نگهدارنده‌ای برای مقدار آن، یعنی داده‌ای که نگهداری می‌‌کند، است. رجوع کردن به (بازیابی) مقدار آن، جایگزینی متغیر نامیده می‌شود.

$

اجازه بدهید به دقت میان نام متغیر و مقدار آن تمایز قایل شویم. اگر variable1 نام یک متغیر باشد، آنوقت‎$variable1‎ یک ارجاع به مقدار آن، یعنی قلم داده‌ای که محتوای آن است، خواهد بود. ‎[1]‎

bash$ variable1=23

bash$ echo variable1
variable1

bash$ echo $variable1
23

تنها مواقعی که یک متغیر «عریان» -- بدون پیشوند $ -- ظاهر می‌گردد، آن هنگامی است که تعریف یا تخصیص داده می‌شود، وقتی unset می‌شود، موقعی که صادر می‌شود، در یک عبارت حسابی درون پرانتزهای دوگانه ‎(( ... ))‎، یا در مورد خاص نمایندگی متغیر از یک سیگنال است ( مثال ‎32-5‎ را ببینید). تخصیص می‌تواند با یک = (همچون در ‎var1=27‎ )، در یک جمله read، و در بالای یک حلقه (‎for var2 in 1 2 3‎) باشد.

محصور کردن یک مقدار ارجاع شده در نقل‌قول‌های دوگانه (‎" ... "‎) از جایگزینی متغیر ممانعت نمی‌کند. این روش نقل‌قول کردن جزیی نامیده می‌شود، گاهی اوقات نیز با عنوان «نقل‌قول ضعیف» منسوب می‌شود. به کار بردن نقل‌قول‌های منفرد (‎' ... '‎) باعث می‌گردد نام متغیر به طور لفظی استفاده شود، و جایگزینی واقع نخواهد شد. این کار، نقل‌قول کردن کامل نامیده می‌شود، گاهی اوقات به عنوان «نقل‌قول قوی» ذکر می‌گردد. برای یک بحث تفصیلی فصل 5 را ببینید.

توجه نمایید که ‎$variable‎ در واقع یک شکل ساده شده برای ‎${variable}‎ است. در مضمون‌هایی که در آنها ترکیب ‎$variable‎ باعث یک خطا می‌گردد، شکل بلندتر ممکن است کار کند ( بخش ‎10.2‎ را ببینید).

مثال ‎4-1‎. تخصیص و جایگزینی پارامتر

#!/bin/bash
# ex9.sh

# متغیرها: تخصیص و جایگزینی‎

a=375
hello=$a
#   ^ ^

#-------------------------------------------------------------------------
#      مجاز نیست ‎=‎ موقع مقدار دهی متغیرها هیچ فاصله‌ای در دو طرف علامت‎
#               در صورتیکه فاصله وجود داشته باشد چه اتفاقی رخ می‌دهد؟‎

#  "VARIABLE =value"
#           ^
#% .اجرا کند ‎"=value"‎ را با شناسه ‎"VARIABLE"‎ اسکریپت سعی می‌کند فرمان‎

#  "VARIABLE= value"
#            ^
#%  را با تنظیم ‎"value"‎ اسکریپت سعی می‌کند فرمان‎
#+ اجرا نماید ‎""‎ به مقدار ‎"VARIABLE"‎ متغیر محیط‎
#-------------------------------------------------------------------------


echo hello      # hello
#      ‎"hello"‎ نه یک ارجاع متغیر، فقط رشته‎

echo $hello     #  375
#    ‎^‎          .این یک ارجاع به متغیر است‎
echo ${hello}   #  375
#        .همچنین یک ارجاع متغیر، مانند بالا‎

#          نقل‌قول کردن
echo "$hello"    # 375
echo "${hello}"  # 375

echo

hello="A B  C   D"
echo $hello   # A B C D
echo "$hello" # A B  C   D
# نتایج متفاوتی دارند  ‎echo "$hello"‎ و ‎echo $hello‎ همانطور که می‌بینیم ‎
# ==============================================
# نقل‌قول کردن متغیر، فضای سفید را محافظت می‌نماید‎
# ==============================================

echo

echo '$hello'  # $hello
#    ^      ^
#به طور ‎$‎ ارجاع متغیر با نقل‌قول منفرد که باعث می‌شود علامت‎
#+   .شده است ‎(یا معاف escaped)‎ لفظی تفسیر بشود، غیرفعال‎

#            .به اثر انواع مختلف نقل‌قول توجه داشته باشید‎


hello=                                 # .تنظیم آن به یک مقدار تهی
echo "\$hello (null value) = $hello"   #     $hello (null value) =
#   توجه کنید که تنظیم یک متغیر به مقدار تهی، همان برقرار نبودن یا‎
#+نیست، هرچند نتیجه نهایی یکسان باشد(مورد زیر را ببینید)‏ unsetting‎

# ---------------------------------------------------------------

#  تنظیم چند متغیر در یک سطر در صورتیکه با
#+     .فاصله از یکدیگر جدا گردند مجاز است 
# .احتیاط، این کار می‌تواند خوانایی را کاهش بدهد، و ممکن است قابل حمل نباشد‎

var1=21  var2=22  var3=$V3
echo
echo "var1=$var1   var2=$var2   var3=$var3"

# .گردد ‎"sh"‎ ممکن است موجب مشکلاتی با نگارش سنتی‎

# --------------------------------------------------------------

echo; echo

numbers="one two three"
#           ^   ^
other_numbers="1 2 3"
#               ^ ^
#                  اگر در داخل متغیری، فضاهای سفید جاسازی شده‌ای
#+                   .وجود داشته باشد، آنوقت نقل‌قولها لازم هستند‎
#  other_numbers=1 2 3                     # یک پیغام خطا می‌دهد‎
echo "numbers = $numbers"
echo "other_numbers = $other_numbers"   # other_numbers = 1 2 3
#                           .پوشش دادن فضای سفید نیز کار می‌کند ‎
mixed_bag=2\ ---\ Whatever
#           ^    ^                       ‎(\) escape‎ فاصله پس از

echo "$mixed_bag"                              # ‎2 ---‎ Whatever‎

echo; echo

echo "uninitialized_variable = $uninitialized_variable"
# دارای محتوای پوچ است (اصلاً محتوایی ندارد)‏ Uninitialized variable متغیر‎
uninitialized_variable=    #   تعریف می‌کند اما مقداردهی نمی‌کند مانند --‎
                           #+    .تنظیم آن به مقدار تهی، همچون مورد بالا‎
echo "uninitialized_variable = $uninitialized_variable"
                           #                 .بازهم دارای مقدار تهی است‎

uninitialized_variable=23               #                     .تنظیم آن
unset uninitialized_variable            #                کردن آن Unset 
echo "uninitialized_variable = $uninitialized_variable"
                                        #      uninitialized_variable =
                                        #  .باز هم دارای محتوای تهی است‎
echo

exit 0

Caution

متغیر ارزش‌گذاری نشده، دارای یک مقدار "null" است -- به هیچوجه مقداری به آن تخصیص نیافته (نه صفر!)

if [ -z "$unassigned" ]
then
  echo "\$unassigned is NULL."
fi     # $unassigned is NULL.

به کار بردن متغیر قبل از اینکه به آن مقدار تخصیص داده شود می‌تواند موجب مشکلاتی گردد.با این حال انجام عملیات حسابی روی متغیرهای مقداردهی نشده امکان‌پذیر است.

echo "$uninitialized"             #       سطر خالی
let "uninitialized += 5"          # افزودن 5 به آن
echo "$uninitialized"             #              5

#                                       نتیجه‌گیری:‎
#یک متغیر مقداردهی نشده دارای محتوای تهی است، گرچه
#+    در یک عملیات حسابی به عنوان ‎0‎ ارزیابی می‌شود.‏
همچنین مثال ‎15-23‎ را ببینید.

یادداشت‌ها

[1]

از نظر تکنیکی، نامِ یک متغیر یک lvalue خوانده می‌شود، به معنای آنکه در طرف چپ یک جمله تخصیص ظاهر می‌شود، همچون در ‎VARIABLE=23‎. یک مقدار متغیر یک rvalue است، یعنی در طرف راست یک جمله تخصیص ظاهر می‌گردد، به عنوان مثال در ‎VAR2=$VARIABLE‎.

یک نامِ متغیر، در واقع، یک ارجاع، یک اشاره‌کننده به مکانی در حافظه است، جایی که داده‌های مرتبط با آن متغیر نگهداری می‌شوند.