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

فصل 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
#

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

a=375
hello=$a
#

#
#      
#               

#
#
#% 

#
#
#% 
#+‎
#


echo hello      #
#     

echo $hello     #  
#
echo ${hello}   #  
#   

#         
echo "$hello"    #
echo "${hello}"  #

echo

hello="A B  C   D"
echo $hello   # 
echo "$hello" # 
#‎
#
#
#

echo

echo '$hello'  #
#
#
#+   

#            ‎


hello=                                 #
echo "\$hello (null value) = $hello"   #    
# 
#+‎

#

#
#+
#‎

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

#‎

#

echo; echo

numbers="one two three"
#
other_numbers="1 2 3"
#
#                 
#+                  ‎
#
echo "numbers = $numbers"
echo "other_numbers = $other_numbers"   #
#                         ‎
mixed_bag=2\ ---\ Whatever
#

echo "$mixed_bag"                              #

echo; echo

echo "uninitialized_variable = $uninitialized_variable"
# 
uninitialized_variable=    # 
                           #+   
echo "uninitialized_variable = $uninitialized_variable"
                           #                

uninitialized_variable=23               #                    
unset uninitialized_variable            #               
echo "uninitialized_variable = $uninitialized_variable"
                                        #     
                                        # 
echo

exit 0

Caution

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

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

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

echo "$uninitialized"             #      
let "uninitialized += 5"          #
echo "$uninitialized"             #             

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

یادداشت‌ها

[1]

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

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