شما هنوز به سیستم وارد نشده اید.

#1 2018-12-21 02:04:29

mr-noip
عضو
ثبت شده: 2018-07-13
ارسال ها: 33

خروجی قطعه کد زیر در بش

سلام دوستان.بنده در حال سرچ در مورد یک مطلبی بودم که با این اسکریپت مواجه شدم.

#!/bin/bash

# Call this script with at least 10 parameters, for example
# ./scriptname 1 2 3 4 5 6 7 8 9 10
MINPARAMS=10

echo

echo "The name of this script is \"$0\"."
# Adds ./ for current directory
echo "The name of this script is \"`basename $0`\"."
# Strips out path name info (see 'basename')


echo

if [ -n "$1" ]              # Tested variable is quoted.
then
 echo "Parameter #1 is $1"  # Need quotes to escape #
fi 

if [ -n "$2" ]
then
 echo "Parameter #2 is $2"
fi 

if [ -n "$3" ]
then
 echo "Parameter #3 is $3"
fi 

# ...


if [ -n "${10}" ]  # Parameters > $9 must be enclosed in {brackets}.
then
 echo "Parameter #10 is ${10}"
fi 

echo "-----------------------------------"
echo "All the command-line parameters are: "$*""

if [ $# -lt "$MINPARAMS" ]
then
  echo
  echo "This script needs at least $MINPARAMS command-line arguments!"
fi  

echo

exit 0

همه چیز مفهوم هست جز این قسمت:

echo "The name of this script is \"`basename $0`\"."

قسمت basename در اینجا دقیقا چه کاری انجام میده و کاراکترهای قبل و بعد اون چه کاراکترهایی هستن؟اگر در مورد همین قسمت مورد اشاره مقداری توضیح بدید ممنون میشم

پ.ن:متوجه تفاوت خروجی هستم اما متوجه نحوه عملکرد نیستم.

آخرین ویرایش توسط mr-noip (2018-12-21 02:05:34)


شروعی جدید smile

آفلاین

#2 2018-12-21 09:46:39

morealaz
Moderator
از : کرمان
ثبت شده: 2016-03-19
ارسال ها: 346

پاسخ: خروجی قطعه کد زیر در بش

اگر یه جستجو میکردید و راهنمای bash رو یه نگاه می کردید خودتون میتونستید متوجه موضوع بشید.

\"`basename $0`\"

به ترتیب اگر شروع کنیم ابتدا دو تا کاراکتر "\ اول و آخر اومده یه escape sequence هست برای اینکه در خروجی کاراکتر " نمایش داده بشه.
بعد بین دو تا کاراکتر ` (backtick) عبارت basename $0 قرار گرفته. این باعث میشه که خروجی دستور بین دو تا backtick بعد از اجرا به عنوان متن استفاده بشه.
فرمانی که قرار هست اجرا بشه basename $0 است. دستور basename یکی از فرامین لینوکس هست که کارش اینه که آدرس دایرکتوری رو از نام یک فایل که به صورت متنی به عنوان پارامتر بهش داده میشه رو حذف میکنه و فقط نام خود فایل رو بر میگردونه بدون آدرس دایرکتوری. پارامتر 0$ هم نام فایلی که در حال حاضر در شل در حال اجرا هست رو بر میگردونه و basename $0 باعث میشه که نام فایل اسکریپت شما بدون بخش مربوط به دایرکتوری در خروجی قرار بگیره.
پس مثلا اگر شما این کد را داخل یه فایل به نام myscript.sh قرار داده باشید که این کد در آدرس زیر قرار گرفته باشه:

/home/morealaz/scripts/myscript.sh

بعد از اجرای این اسکریپت زمانی که به این خط میرسه:

echo "The name of this script is \"`basename $0`\"."

مقدار پارامتر 0$ به صورت زیر هست:

/home/morealaz/scripts/myscript.sh

و خروجی basename $0 برابر هست با myscript.sh که نام فایل بدون آدرس دایرکتوری های اون می باشد و در نهایت خروجی زیر در صفحه نمایش چاپ می شود:

The name of this script is "myscript.sh".

آفلاین

#3 2018-12-21 14:21:08

mr-noip
عضو
ثبت شده: 2018-07-13
ارسال ها: 33

پاسخ: خروجی قطعه کد زیر در بش

morealaz نوشته است که:

بعد بین دو تا کاراکتر ` (backtick) عبارت basename $0 قرار گرفته. این باعث میشه که خروجی دستور بین دو تا backtick بعد از اجرا به عنوان متن استفاده بشه.

متشکرم.بنده متاسفانه فقط همین قسمت

` basename $0 `

متوجه نشدم.
در واقع کاراکتر ` باعث میشه درون فرمان echo بتونیم از فرامین لینوکس استفاده کنیم و به عنوان رشته در خروجی چاپ نشه و فرمان مد نظر اجرا بشه؟


شروعی جدید smile

آفلاین

#4 2018-12-21 16:42:08

morealaz
Moderator
از : کرمان
ثبت شده: 2016-03-19
ارسال ها: 346

پاسخ: خروجی قطعه کد زیر در بش

به نقل از (1)bash:

   Command Substitution
       Command substitution allows the output of a command to replace the com‐
       mand name.  There are two forms:

              $(command)
       or
              `command`

       Bash performs the expansion by executing command in a subshell environ‐
       ment and replacing the command substitution with the standard output of
       the command, with any trailing newlines deleted.  Embedded newlines are
       not deleted, but they may be removed during word splitting.   The  com‐
       mand  substitution  $(cat  file)  can be replaced by the equivalent but
       faster $(< file).

       When the old-style backquote form of substitution  is  used,  backslash
       retains  its  literal  meaning except when followed by $, `, or \.  The
       first backquote not preceded by a backslash terminates the command sub‐
       stitution.   When using the $(command) form, all characters between the
       parentheses make up the command; none are treated specially.

       Command substitutions may be nested.  To nest when using the backquoted
       form, escape the inner backquotes with backslashes.

       If  the  substitution  appears within double quotes, word splitting and
       pathname expansion are not performed on the results.

آفلاین

پانوشت انجمن

پشتیبانی توسط تیم آرچ لینوکس ایران و نیرو گرفته با FluxBB