فصل 9. یک نگاه دیگر به متغیرها

‎9.2‎- تعیین نوع برای متغیرها: declare یا typeset

فرمانهای داخلی declare یا typeset که دقیقاً مترادف هستند، تعریف نمودن خصوصیات متغیرها را میسر می‌کنند. این یک شکل بسیار ضعیف از تعیین نوع [1] قابل دسترس در برخی زبانهای برنامه‌نویسی است. فرمان declare مخصوص نگارش 2 یا جدیدتر Bash است. فرمان typeset در اسکریپت‌های ksh نیز کار می‌کند.

گزینه‌های declare/typeset

‎-r‎ فقط خواندنی

(‎declare -r var1‎ همانند ‎readonly var1‎ عمل می‌کند)

این مورد، هم‌ارِز زمختِ توصیف‌کننده نوع const در C است. اقدام برای تغییر مقدار متغیر فقط خواندنی با صدور یک پیغام خطا به شکست منجر می‌گردد.

declare -r var1=1
echo "var1 = $var1"   # var1 = 1

(( var1++ ))          # x.sh: line 4: var1: readonly variable

‎-i‎ عدد صحیح

declare -i number
# به عنوان یک عدد صحیح رفتار می‌کند ‎"number"‎ اسکریپت بعد از این با		

number=3
echo "Number = $number"     # Number = 3

number=three
echo "Number = $number"     # Number = 0
# به عنوان یک عدد صحیح ارزیابی کند ‎"three"‎‎ سعی در ارزیابی رشته

برای متغیرهای تعریف شده به عنوان عدد صحیح، برخی عملیات حسابی بدون نیاز به expr یا let اجازه داده می‌شود.

n=6/3
echo "n = $n"       # n = 6/3

declare -i n
n=6/3
echo "n = $n"       # n = 2

‎-a‎ آرایه

declare -a indices

با متغیر indices به عنوان یک آرایه رفتار خواهد شد.

‎-f‎ تابع(ها)

declare -f

یک سطر ‎declare -f‎ فاقد شناسه، در یک اسکریپت باعث لیست کردن تمام توابع تعریف شده در آن اسکریپت می‌گردد.

declare -f function_name

‎declare -f function_name‎ در یک اسکریپت فقط تابع نامبرده را لیست می‌کند.

‎-x export‎

declare -x var3

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

‎-x var=$value‎

declare -x var3=373

فرمان declare در همان سطر تعریف مشخصات، تخصیص مقدار به متغیر را نیز اجازه می‌دهد.

مثال ‎9-10‎. کاربرد declare برای تعیین نوع متغیرها

#!/bin/bash

func1 ()
{
  echo This is a function.
}

declare -f        # .تابع فوق را لیست می‌کند

echo

declare -i var1   #   .یک عدد صحیح است ‎var1‎ 
var1=2367
echo "var1 declared as $var1"
var1=var1+1       #          .را بر طرف می‌کند ‎"let"‎ تعریف عدد صحیح نیاز به
echo "var1 incremented by 1 is $var1."
                  # .اقدام برای تغییر متغیری که به عنوان صحیح تعریف گردیده
echo "Attempting to change var1 to floating point value, 2367.1."
var1=2367.1       #     .به یک پیغام خطا منجر می‌گردد، بدون تغییری در متغیر
echo "var1 is still $var1"

echo

declare -r var2=13.36         #   تنظیم خصوصیت متغیر و تخصیص مقدار ‎declare‎ 
                              #+             .را به طور همزمان اجازه می‌دهد
echo "var2 declared as $var2" #       .اقدام برای تغییر  متغیر فقط خواندنی
var2=13.37                    # .پیغام خطایی تولید و از اسکریپت خارج می‌شود

echo "var2 is still $var2"    #                 .این سطر اجرا نخواهد گردید

exit 0                        #              .اسکریپت در اینجا خارج نمی‌شود

Caution

استفاده از دستور داخلی declare حوزه متغیر را محدود می‌کند.

foo ()
{
FOO="bar"
}

bar ()
{
foo
echo $FOO
}

bar   #  .چاپ می‌شود ‎bar‎

اما . . .

foo (){
declare FOO="bar"
}

bar ()
{
foo
echo $FOO
}

bar  # .چیزی چاپ نمی‌کند


# با تشکر از Michael Iatrou به خاطر روشن کردن این مورد.

‎9.2.1‎. یک استفاده دیگر برای declare

فرمان declare می‌تواند در شناسایی متغیرها، محیطی یا غیر آن، مفید باشد. این مورد مخصوصاً برای آرایه‌ها می‌تواند سودمند باشد.

bash$ declare | grep HOME
HOME=/home/bozo

bash$ zzy=68
bash$ declare | grep zzy
zzy=68


bash$ Colors=([0]="purple" [1]="reddish-orange" [2]="light green")
bash$ echo ${Colors[@]}
purple reddish-orange light green
bash$ declare | grep Colors
Colors=([0]="purple" [1]="reddish-orange" [2]="light green")

یادداشت‌ها

[1]

در این مضمون، تعیین نوع یک متغیر به معنای دسته‌بندی و محدود کردن خصوصیات آن است. برای مثال، یک متغیر تعریف شده یا تعیین نوع شده به عنوان یک عدد صحیح دیگر برای مقایسه‌های رشته‌ای معتبر نیست.

declare -i intvar

intvar=23
echo "$intvar"   # 23
intvar=stringval
echo "$intvar"   # 0