خط فرمان لینوکس

ترجمه فارسی LinuxCommand.org

خط فرمان لینوکس

ترجمه فارسی LinuxCommand.org

جایگزینی فرمان و ثابت‌ها

جایگزینی فرمان و ثابت‌ها

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

موقعی که آخرین بار اسکریپت‌مان را ترک کردیم، می‌توانست یک صفحه HTML تولید کند که شامل چند سطر متنِ ساده، به انضمام نام ماشینی باشد که ما از متغیر محیط HOSTNAME به دست آوردیم. اکنون، برای نشان دادن آخرین زمانی که به روزرسانی شده همراه با نام کاربری که آن را انجام داده، یک نشانه زمان به صفحه اضافه خواهیم نمود.

#!/bin/bash

# sysinfo_page - HTML اسکریپتی برای تولید یک فایل‎ 

title="System Information for"

cat <<- _EOF_
    <html>
    <head>
        <title>
        $title $HOSTNAME
        </title>
    </head>

    <body>
    <h1>$title $HOSTNAME</h1>
    <p>Updated on $(date +"%x %r %Z") by $USER</p>
    </body>
    </html>
_EOF_
       

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

$(date +"%x %r %Z")

کاراکترهای ‎"$( )"‎ به پوسته می‌گویند، «نتایج فرمان محصور شده در پرانتزها را جایگزین کن». ما در اسکریپت‌مان می‌خواهیم پوسته نتایج فرمان ‎date +"%x %r %Z"‎ را که بیان کننده تاریخ و زمان جاری است، درج کند. فرمان date دارای ویژگی‌ها و گزینه‌های قالب‌بندی بسیار است. برای دیدن تمام آنها، این کد را امتحان کنید:

[me@linuxbox me]$ date --help | less

آگاه باشید که یک ترکیب جایگزین قدیمی‌تر برای ‎"$(command)"‎ وجود دارد که کاراکتر backtick ( ` ) را استفاده می‌کند. این شکل قدیمی‌تر با پوسته اصیل ‎Bourne (sh)‎ سازگار است. من مایل به استفاده از این شکل قدیمی‌تر نیستم چون من اینجا در حال آموزش bash مدرن هستم، نه sh، و گذشته از این، فکر می‌کنم backtickها زشت هستند. پوسته bash اسکریپت‌های نوشته شده برای sh را کاملاً پشتیبانی می‌کند بنابراین ترکیب‌های زیر نتایج یکسانی دارند:

$(command)
`command`

تخصیص نتایج یک فرمان به یک متغیر

شما همچنین می‌توانید نتایج یک فرمان را به یک متغیر تخصیص بدهید:

right_now=$(date +"%x %r %Z")

حتی می‌توانید متغیرها را تو در تو نمایید (قرار دادن یکی در داخل دیگری)، مانند این:

right_now=$(date +"%x %r %Z")
time_stamp="Updated on $right_now by $USER"

ثابت‌ها

همچنانکه نام متغیر اشاره می‌کند، محتوای یک متغیر تابع تغییر است. این به معنای آن است که انتظار می‌رود در خلال اجرای اسکریپت شما، شاید بواسطه موردی که شما انجام می‌دهید محتوایش ویرایش گردیده باشد.

از طرف دیگر، ممکن است مقادیری وجود داشته باشند که یکبار تنظیم شوند، و هرگز نباید تغییر کنند. اینها ثابت‌ها نامیده می‌شوند. من این را در اینجا می‌آورم زیرا یک مفهوم رایج در برنامه‌نویسی است. اکثر زبانهای برنامه‌نویسی دارای امکانات خاصی برای پشتیبانی از کمیت‌هایی هستند که تغییر آنها اجازه داده نمی‌شود. Bash نیز دارای این امکانات هست، اما صادقانه، من هرگز استفاده آن را ندیدم. در عوض، اگر یک کمیت نامزد ثابت بودن باشد، یک نام با حروف بزرگ به آن داده می‌شود برای اینکه به برنامه نویس یادآوری گردد که آن کمیت باید یک ثابت در نظر گرفته شود، حتی اگر مجبور به آن نشود.

متغیرهای محیط به طور معمول ثابت در نظر گرفته می‌شوند چون آنها به ندرت تغییر داده می‌شوند. همانند ثابت‌ها، به متغیرهای محیط مطابق قرارداد نام‌های با حروف بزرگ داده می‌شود. در اسکریپت‌های پس از این، من این قرارداد را به کار خواهم برد - نام‌های با حروف بزرگ برای ثابت‌ها و حروف کوچک برای متغیرها.

بنابراین با آنچه ما می‌دانیم، برنامه ما اینطور ظاهر می‌گردد:

#!/bin/bash

# sysinfo_page - HTML اسکریپتی برای تولید یک فایل‎ 

title="System Information for $HOSTNAME"
RIGHT_NOW=$(date +"%x %r %Z")
TIME_STAMP="Updated on $RIGHT_NOW by $USER"

cat <<- _EOF_
    <html>
    <head>
        <title>
        $title
        </title>
    </head>

    <body>
    <h1>$title</h1>
    <p>$TIME_STAMP</p>
    </body>
    </html>
_EOF_