سؤال ما هو $ * و $ # في Linux؟


ماذا تقصد متغيرات البيئة التالية في لينكس؟

  1. ما هو $ * (علامة الدولار متبوعة بعلامة النجمة)؟
  2. ما هو $ # (علامة الدولار بجانب علامة التجزئة / علامة الرقم / علامة octothorpe / الجنيه)؟

75
2018-02-17 18:53


الأصل




الأجوبة:


من عند هنا:

$#    Stores the number of command-line arguments that 
      were passed to the shell program.
$?    Stores the exit value of the last command that was 
      executed.
$0    Stores the first word of the entered command (the 
      name of the shell program).
$*    Stores all the arguments that were entered on the
      command line ($1 $2 ...).
"$@"  Stores all the arguments that were entered
      on the command line, individually quoted ("$1" "$2" ...).

في الأساس ، $# هو عدد من الوسيطات المعطاة عند تنفيذ النص البرمجي. $* هي سلسلة تحتوي على جميع الوسائط. فمثلا، $1 هي الحجة الأولى وهلم جرا. هذا مفيد ، إذا كنت تريد الوصول إلى وسيطة محددة في البرنامج النصي الخاص بك.

كما علق بريان ، هنا مثال بسيط. إذا قمت بتشغيل الأمر التالي:

./command -yes -no /home/username
  • $# = 3
  • $* = -yes -no /home/username
  • $@ = صفيف: {"-yes", "-no", "/home/username"}
  • $0 = ./command، $1 = -yes إلخ

هذه جزء من معيار POSIX، ويجب أن تكون مدعومة بجميع القذائف المتوافقة. للإشارة ، أدناه تعريفات POSIX القياسية لكل معلمة خاصة. هل لاحظ أن هناك ثلاثة متغيرات إضافية: $-، $$ و $!.

$@:

يمتد إلى المعلمات الموضعية ، بدءا من واحد. عندما يحدث التوسع داخل علامات اقتباس مزدوجة ، وحيث تقسيم المجال (انظر تقسيم المجاليتم تنفيذ كل معلمة موضعية كحقل مستقل ، مع وجود شرط بأن يظل توسع المعلمة الأولى متصلاً بالجزء الأول من الكلمة الأصلية (على افتراض أن المعلمة الموسعة مدمجة داخل الكلمة) ، و يجب أن يتم ضم توسع المعلمة الأخيرة مع الجزء الأخير من الكلمة الأصلية. إذا لم تكن هناك معلمات موضعية ، فإن توسع "@" سيولد حقولًا صفرية ، حتى عندما تكون "@" مزدوجة.

$*:

يمتد إلى المعلمات الموضعية ، بدءا من واحد. عندما يحدث التوسع ضمن سلسلة مقتبسة مزدوجة (انظر التنصيص) ، فإنه يجب توسيع إلى حقل واحد مع قيمة كل معلمة مفصولة بحرف الأول من متغير IFS ، أو من قبل إذا IFS غير محددة. إذا تم تعيين IFS إلى سلسلة فارغة ، فهذا لا يعني إفسادها ؛ حرفه الأول غير موجود ، لذا فإن قيم المعلمات متسلسلة.

$#:

يتوسع إلى الرقم العشري للمعلمات الموضعية. يجب ألا يتم حساب اسم الأمر (المعلمة 0) في الرقم المعطى بواسطة "#" لأنه معلمة خاصة ، وليس معلمة موضعية.

$?:

يتوسع إلى حالة الخروج العشري لخط الأنابيب الأخير (راجع خطوط الأنابيب).

$-:

(Hyphen.) يمتد إلى علامات الخيار الحالية (أسماء الخيارات أحادية الحرف متسلسلة في سلسلة) كما هو محدد في الطلب ، بواسطة جلس أمر مدمج خاص ، أو ضمنيًا بالصدفة.

$$:

يتوسع لمعرف العملية العشري للقشرة المستدعاة. في subshell (انظر بيئة تنفيذ Shell ) ، يجب توسيع "$" إلى نفس قيمة shell الحالي.

$!:

يتوسع لمعرف العملية العشرية لأحدث خلفية الأمر (انظر قوائم) أعدم من القشرة الحالية. (على سبيل المثال ، لا تؤثر أوامر الخلفية المنفذة من subshells على قيمة "$!" في بيئة shell الحالية.) بالنسبة لخط الأنابيب ، يكون معرف العملية هو الأمر الأخير في خط الأنابيب.

$0:

(Zero.) يتوسع إلى اسم البرنامج النصي shell أو shell. نرى ش للحصول على وصف مفصل لكيفية اشتقاق هذا الاسم.


105
2018-02-17 18:59



هذه المعلمات الخاصة صحيحة في جميع قذائف بورني المشتقة (مثل sh، bash، dash، ash، ksh، zsh). - Dennis Williamson
تصحيح: $* و $# هي 1) متغيرات قذيفة ، وليس متغيرات البيئة ؛ 2) موحدة (جزء من مواصفات POSIX.) - grawity
لاحظ أيضا ذلك "$@" مرات عديدة مكتوبة ك ${1+"$@"} (لأسباب قابلية) ، انظر stackoverflow.com/questions/743454/... للحصول على تفسير. - hlovdal
نظرًا لأنه "لا يمكن حساب اسم الأمر (المعلمة 0) ..." ، في المثال أعلاه يجب أن يكون $ # = 2 ، بدءًا من احتساب الصفر. - Josef Klimuk


$# يمثل عدد الوسيطات:

[root@baymax ~]# set -- a
[root@baymax ~]# echo $#
1

[root@baymax ~]# set -- a b c
[root@baymax ~]# echo $#
3

0
2017-09-24 05:34



مرحبًا بك في Super User. يعد الموقع قاعدة معرفة ، لذا فإن الهدف هو أن كل إجابة توفر حلاً للسؤال الذي لم يُسهم به من قبل. هذا يعالج نصف السؤال فقط ، ويتم تغطية المعلومات بشكل جيد بالفعل في الإجابة السابقة. - fixer1234