الفرق بين المراجعتين ل"Bash/shell expansion"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(إدخال 2.0 محتوى أولي)
(إدخال 2.1 تعديل على المحتوى)
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE:التوسعات في Bash}}</noinclude>
 
<noinclude>{{DISPLAYTITLE:التوسعات في Bash}}</noinclude>
  
== عام ==
+
بعد تقسيم الأمر في Bash إلى وحدات (Tokens) -انظر [[Bash/building blocks#.D8.A7.D9.84.D8.A8.D9.86.D9.8A.D8.A9 .D8.A7.D9.84.D9.84.D8.BA.D9.88.D9.8A.D8.A9 .D9.84.D9.84.D8.B5.D8.AF.D9.81.D8.A9 .28Shell Syntax.29|وحدات البناء الأساسية في Bash، البنية اللغوية للصدفة]]- فإن تلك الوحدات توسَّع (expanded) أو تُحَلّ (resolved)، وسنفصّل الآن تلك التوسعات وفقًا لترتيب كل منها، ثم بعد إتمام جميع التوسعات تُنفّذ عملية حذف الاقتباسات.
بعد أن يُقسَّم الأمر في Bash إلى وحدات (انظر وحدات البناء الأساسية في Bash، البنية اللغوية للصدفة) فإن تلك الوحدات تُوسَّع أو تُحَل، وتُجرى ثمان أنواع من التوسعات -سنفصلها لاحقًا فيما يلي وفقًا لترتيب كل منها- ثم تُنفذ عملية حذف الاقتباسات بعد إتمام جميع التوسّعات.
 
  
== توسع القوس المعقوف Brace Expansion ==
+
== توسُّع القوس المعقوف {} ==
توسع القوس المعقوف {} هو آلية يمكن إنشاء نصوص تعسفية من خلالها، فالأنماط التي سيُنفَّذ عليها توسع القوس المعقوف تبدأ باستهلال اختياري (optional preamble) متبوع بسلسلة من النصوص (strings) تفصل بين كل منها فاصلة , وتكون تلك النصوص بين قوسين معقوفيْن، ثم تأتي بعد ذلك حاشية (postscript) اختيارية أيضًا. ويوضع الاستهلال في بداية كل نص داخل القوس -بعد التوسُّع-، ثم تُلحق الحاشية بنهاية تلك النصوص، وذلك بالترتيب من اليسار إلى اليمين.
+
توسع القوس المعقوف هو آلية يمكن من خلالها إنشاء نصوص عشوائية (arbitrary strings)، إذ تأخذ الأنماط (patterns) التي سيُنفَّذ عليها توسع القوس المعقوف باستهلال اختياري (optional preamble) متبوع بسلسلة من النصوص تفصل بين كل منها فاصلة، وتكون تلك النصوص بين قوسين معقوفين <code>{}</code> ثم تأتي بعد ذلك حاشية (postscript) اختيارية أيضًا. ويوضع الاستهلال في بداية كل نص داخل القوس -بعد التوسع- ثم تُلحَق الحاشية بنهاية كل نص أيضًا، وذلك بالترتيب من اليسار إلى اليمين.
  
يمكن أن تتداخل توسعات القوس المعقوف لكن ذلك لا يعني أن النتائج ستُصنَّف، وإنما يظل الترتيب كما هو من اليسار إلى اليمين:<syntaxhighlight lang="bash">
+
قد تتداخل توسعات القوس المعقوف لكن ذلك لا يعني أن النتائج يمكن تصنيفها، بل يظل الترتيب كما هو من اليسار إلى اليمين، انظر المثال التالي للتوضيح:<syntaxhighlight lang="bash">
 
hsoub ~> echo sp{el,il,al}l
 
hsoub ~> echo sp{el,il,al}l
 
spell spill spall
 
spell spill spall
  
  
</syntaxhighlight>يُنفَّذ توسع القوس المعقوف قبل أي توسع آخر ويُحتفظ في النتيجة بأي محارف لها معاني خاصة بالنسبة لتوسعات أخرى، ذلك أن هذا التوسّع نصي حصرًا، فلا تطبق Bash أي تفسير على البنية اللغوية لسياق التوسع أو النص الذي بين القوس المعقوف. وكذلك، من أجل تجنب حدوث تعارض فإن النص "}$" لا يُعد صالحًا لتوسع القوس المعقوف.
+
</syntaxhighlight>يُنفَّذ توسع القوس المعقوف قبل أي توسع آخر، ويُحتفظ في النتيجة بأي محارف ذات معاني خاصة بالنسبة للتوسعات الأخرى، ذلك أن هذ التوسع نصي حصرًا فلا تفسر Bash البنية اللغوية لسياق التوسع ولا للنص الذي بين القوسين المعقوفين. كذلك فإن النص <code>}$</code> ليس صالحًا لتوسع القوس المعقوف من أجل تجنب التعارض الذي قد يحدث.
  
يجب أن يحتوي توسع القوس على قوسين معقوفيْن بدون علامات تنصيص حول أي منهما، وفاصلة واحدة على الأقل , ولا تكون بين علامتي تنصيص أيضًا. وأي توسع قوس معقوف يكون على خلاف تلك الهيئة فإنه يُترك دون تغيير.
+
ويجب أن يحتوي توسع القوس المعقوف على قوسين معقوفيْن بدون علامات اقتباس حول أي منهما وفاصلة <code>,</code> واحدة على الأقل لا تكون بين علامات اقتباس أيضًا، وأي توسّع للقوس المعقوف يكون على خلاف تلك الصيغة فإنه يُترك دون تغيير.
  
 
== توسع المَدَّة (~) ==
 
== توسع المَدَّة (~) ==
إن بدأت كلمة بمحرف المَدَّة دون علامات تنصيص ("~") فإن كل المحارف إلى أول شرطة مائلة ليست بين علامتي تنصيص (أو كل المحارف إن لم توجد شرطة مائلة بدون علامات تنصيص) تُعد مقدمة للمدَّة، وإن لم يوضع أي محرف من محارف مقدمة المدة داخل علامتي تنصيص فإن المحارف التي في مقدمة المَدَّة وتأتي بعد المَدَّة تعامل على أنها اسم تسجيل دخول محتمل، فإن كان هذا اسم تسجيل الدخول هذا نصًا فارغًا فإن المدة تُستبدل بقيمة متغير HOME، فإن كان متغير HOME غير مضبوط على قيمة فإن مجلد المنزل للمستخدم الذي ينفذ الصدفة يُستخدم مكانه. وإلا، فإن مقدمة المدة تُستبدل بمجلد المنزل المرتبط باسم تسجيل الدخول.
+
إن بدأت كلمة بمحرف المَدَّة <code>~</code> دون علامات اقتباس فإن كل المحارف حتى أول شرطة مائلة <code>/</code> بدون علامات اقتباس -أو كل المحارف إن لم توجد شرطة مائلة بدون علامات اقتباس- تُعد مقدمة للمدَّة (tilde-prefix) ، وتُعامل المحارف التي تأتي بعد المدة في '''مقدمة المدة''' (tilde-prefix) على أنها اسم لتسجيل الدخول، وذلك إن لم يوضع أي محرف من محارف مقدمة المَدَّة داخل علامتي اقتباس، فإن كان اسم تسجيل الدخول ذاك فارغًا فإن المدة تُستبدل بقيمة متغير <code>HOME</code>، فإن كان متغير <code>HOME</code> غير مضبوط على أي قيمة فإن مجلد home الخاص بالمستخدم الذي يُنفّذ الصدفةَ يُستخدم مكانه، وإلا فإن مقدمة المَدة تُستبدل بمجلد المنزل المرتبط باسم تسجيل الدخول.
  
إن كانت مقدمة المدة هي "+~"فإن قيمة المتغير PWD تستبدل مقدمة المدة، أما إن كانت مقدمة المدة "-~" فإن قيمة المتغير OLDPWD تحل محلها في حال ضبط ذلك المتغير على قيمة.
+
إن كانت '''مقدمة المدة''' هي <code>+~</code> فإن قيمة المتغير <code>PWD</code> تحل محلها، أما إن كانت '''مقدمة المدة''' <code>-~</code> فإن قيمة المتغير <code>OLDPWD</code> هي التي تحل محلها، في حال ضبط قيمة ما لذلك المتغير. وإن كانت المحارف التي تلي المدة في '''مقدمة المدة''' تتكون من عدد N (قد) يسبقه <code>+</code> أو <code>-</code> فإن '''مقدمة المدة''' تُستبدل بالعنصر الذي يماثلها من مكدس المجلدات (Directory Stack)، كما سيُعرض كوسيط في أمر <code>dirs</code> الذي تستدعيه المحارف التي تلي المَدّة في '''مقدمة المدة'''، فإن كانت المحارف التي تلي المَدة تتكون من عدد بدون إشارة موجب أو سالب قبله فسيُفترض أن هذا العدد موجب. كذلك إن كان اسم تسجيل الدخول غير صالح، أو فشلَ توسع المدة فإن الكلمة تترك دون تغيير.
  
إن كانت المحارف التي تلي المدة في مقدمة المدة تتكون من عدد N سبقه + أو - (اختياريًا) فإن مقدمة المدة تُستبدل بالعنصر الذي يماثلها من مكدس المجلدات، كما سيُعرَض في أمر dirs الذي تستدعيه المحارف التي تلي المَدة في مقدمة المدة كوسيط، فإن كانت مقدمة المدة تتكون من -بدون المدة- عدد بدون إشارة موجب أو سالب قبله، فيفترض النظام أنها إشارة الموجب.
+
تُفحص تعيينات المتغيرات بعد <code>:</code> أو <code>=</code> مباشرة بحثًا عن مقدمات للمدة لا تكون بين علامات اقتباس، وتُوسّع المدة في تلك الحالات، وعليه يمكن استخدام أسماء ملفات فيها محرف المدة في التعيينات التي تكون لمتغيرات <code>PATH</code> و <code>MAILPATH</code> و <code>CDPATH</code>، وتُعيّن الصدفة القيمةَ الموسعة.
 
 
إن كان اسم تسجيل الدخول غير صالح أو فشل توسع المدة فإن الكلمة تترك دون تغيير.
 
 
 
يُتفقَّد كل تعيين لمتغير بحثًا عن مقدمات للمدة غير منصصة مباشرة بعد : أو =، وتوسع المدة في تلك الحالات، وعليه يمكن استخدام أسماء ملفات فيها محرف المدة في التعيينات إلى متغير PATH و MAILPATH و CDPATH، وتعين الصدفة القيمة الموسعة.
 
  
 
مثال:<syntaxhighlight lang="bash">
 
مثال:<syntaxhighlight lang="bash">
 
hsoub ~> export PATH="$PATH:~/testdir"
 
hsoub ~> export PATH="$PATH:~/testdir"
  
</syntaxhighlight>سيوسَّع testdir/~ إلى HOME/testdir$، لذا إن كان HOME$ هو var/home/hsoub/ فإن مجلد var/home/hsoub/testdir/ يضاف إلى محتويات متغير PATH.
+
</syntaxhighlight>سيوسَّع <code>testdir/~</code> إلى <code>HOME/testdir$</code>، لذا إن كان <code>HOME$</code> هو <code>var/home/hsoub/</code> فإن مجلد <code>var/home/hsoub/testdir/</code> يضاف إلى محتويات متغير <code>PATH</code>.
 
+
==معامل الصدفة وتوسع المتغير==
== معامل الصدفة وتوسع المتغير ==
+
يسبق محرف <code>$</code> توسع المعامِل (parameter expansion) وإحلال الأوامر (command substitution) والتوسعات الحسابية (arithmetic expansion)، قد يكون اسم المعامِل الذي سيوسَّع -أو رمزه- بين قوسين معقوفيْن وذلك اختياري لكنه يحمي المتغير الذي سيوسَّع من المحارف التي تليه والتي قد تُفسر على أنها جزء من الاسم. وحين تُستخدم الأقواس المعقوفة فإن الطرف الثاني من القوس هو أول <code>{</code> غير مهرَّب بواسطة شرطة مائلة خلفية <code>\</code> أو بين نص مقتبَس أو داخل توسع حسابي مضمَّن (embedded arithmetic expansion) أو أمر تم إحلاله أو توسُّع لمعامِل.
يقدم محرف $ توسع المعامل واستبدال الأمر والتوسع الحسابي. قد يكون اسم المعامل الذي سيوسع -أو رمزه- بين قوسين معقوفين، وهو أمر خياري لكنه يحمي المتغير الذي سيوسع من المحارف التي تليه والتي قد تفسر على أنها جزء من الاسم.
 
 
 
حين تستخدم الأقواس المعقوفة فإن الطرف الثاني من القوس هو أول { غير مهرب بواسطة شرطة مائلة خلفية أو بين نص مقتبس أو داخل توسع حسابي مضمن أو أمر مستبدل أو توسع لمعامل.
 
  
والصورة الأساسية لتوسع المعامل هي "{PARAMETER}$"، وتستبدل قيمة PARAMETER، والأقواس ضرورية حين يكون PARAMETER معاملًا موضعيًا بأكثر من رقم واحد، أو حين يُتبع PARAMETER بمحرف لن يفسر كجزء من الاسم.
+
والصورة الأساسية لتوسع المعامِل هي <code>{PARAMETER}$</code>، وتُستبدل قيمة <code>PARAMETER</code>، وتكون الأقواس ضرورية حين يكون <code>PARAMETER</code> معامِلًا موضعيًا بأكثر من رقم واحد أو حين يُتبع <code>PARAMETER</code> بمحرَف لن يُفسر كجزء من الاسم.
  
إن كان أول محرف من PARAMETER هو علامة تعجب فإن Bash تستخدم قيمة المتغير المتكون من بقية "PARAMETER" كاسم للمتغير، ويوسع هذا المتغير وتستخدم تلك القيمة في بقية الاستبدال، بدلًا من قيمة PARAMETER نفسه، هذا يعرف باسم التوسع غير المباشر.
+
وإن كان أول محرف من المعامِل <code>PARAMETER</code> علامة تعجب فإن <code>Bash</code> تستخدم قيمة المتغير المتكون من بقية <code>PARAMETER</code> كاسم للمتغير، ويوسَّع ذلك المتغير وتُستخدم تلك القيمة في بقية الاستبدال بدلًا من قيمة <code>PARAMETER</code> نفسه، ويُعرف هذا باسم التوسع غير المباشر، على خلاف التوسع المباشر المنتشر والذي يحدث في أبسط الحالات مثل الحالة السابقة أو هذه الحالة:<syntaxhighlight lang="bash">
 
 
لا شك أنك عالم بالتوسع المباشر للمعامل، بما أنه يحدث دومًا حتى في أبسط الحالات مثل التي بالأعلى أو الحالة التالية:<syntaxhighlight lang="bash">
 
 
hsoub ~> echo $SHELL
 
hsoub ~> echo $SHELL
 
/bin/bash
 
/bin/bash
سطر 48: سطر 38:
 
hsoub ~> echo ${!N*}
 
hsoub ~> echo ${!N*}
 
NNTPPORT NNTPSERVER NPX_PLUGIN_PATH
 
NNTPPORT NNTPSERVER NPX_PLUGIN_PATH
</syntaxhighlight>لاحظ أن هذا يختلف عن *echo $N
+
</syntaxhighlight>لاحظ أن هذا يختلف عن <code>*echo $N</code>
  
تسمح بنية المثال التالي بإنشاء المتغير المذكور إن لم يكن قد أنشئ من قبل:
+
تسمح بنية المثال التالي بإنشاء المتغير المذكور إن لم يكن قد أنشئ من قبل: <code>{VAR:=value}$</code>
 
 
{VAR:=value}$
 
  
 
مثال:<syntaxhighlight lang="bash">
 
مثال:<syntaxhighlight lang="bash">
سطر 59: سطر 47:
 
hsoub ~> echo ${HSOUB:=Hsoub}
 
hsoub ~> echo ${HSOUB:=Hsoub}
 
Hsoub
 
Hsoub
</syntaxhighlight>قد لا تُعيَّن المعاملات الخاصة -ضمن معاملات موضعية أخرى- بهذه الطريقة.
+
</syntaxhighlight>قد لا تُعيَّن المعاملات الخاصة -ضمن معاملات موضعية أخرى- بهذه الطريقة. سنناقش استخدام الأقواس المعقوفة في معاملة المتغيرات في [[Bash/more on variables|المزيد حول المتغيرات في Bash]]، ستجد معلومات أكثر كذلك في صفحات دليل info.
 +
==إحلال الأوامر==
 +
يسمح إحلال الأوامر لخرج أمر ما أن يحِل محل الأمر نفسه، ويحدث إحلال الأوامر حين يكون أمر ما على هذه الصورة: <code>(الأمر)$</code> أو على هذه الصورة باستخدام الفاصلة العليا المائلة `: <code>`الأمر`</code>
  
سنناقش استخدام الأقواس المعقوفة في معاملة المتغيرات في [[Bash/more on variables|المزيد حول المتغيرات في Bash]]، ستجد معلومات أكثر كذلك فيي صفحات دليل info.
+
تنفّذ Bash التوسع بتنفيذ الأمر واستبدال إحلال الأمر بالخرج العادي للأمر مع حذف أي أسطر جديدة تابعة (trailing newlines)، ولا تُحذف الأسطر الجديدة المضمنة لكن قد تُحذف أثناء انقسام الكلمات.<syntaxhighlight lang="bash">
 
 
== استبدال الأوامر ==
 
يسمح استبدال الأوامر لخرج أمر ما باستبدال الأمر نفسه، يحدث استبدال الأوامر حين يكون أمر ما على هذه الصورة:
 
 
 
(الأمر)$
 
 
 
أو على هذه الصورة باستخدام الفاصلة العليا المائلة `:
 
 
 
`الأمر`
 
 
 
تنفذ Bash التوسع بتنفيذ الأمر واستبدال إحلال الأمر بالخرج العادي للأمر مع حذف أي أسطر جديدة تابعة، لكن الأسطر الجديدة المضمنة لا تحذف لكن قد تحذف أثناء انقسام الكلمات.<syntaxhighlight lang="bash">
 
 
hsoub ~> echo `date`
 
hsoub ~> echo `date`
 
Thu Feb 6 10:06:20 CET 2003
 
Thu Feb 6 10:06:20 CET 2003
</syntaxhighlight>حين يستخدم أسلوب التنصيص الخلفي القديم من الاستبدال فإن الشرطة المائلة الخلفية تحتفظ بمعناها الحرفي باستثناء عند إتباعها بعلامة $ أو ` أو  \.
+
</syntaxhighlight>تحتفظ الشرطة المائلة الخلفية <code>\</code> بمعناها الحرفي عند استخدام صيغة الاقتباس الخلفي القديمة للإحلال (backquoted form of substitution)، إلا حين تُتبَع إتباعها بعلامة <code>$</code> أو <code>`</code> أو  <code>\</code>، وتنهي أول فاصلة عليا مائلة ` (backtick) غير مسبوقة بشرطة خلفية مائلة (backslash) إحلال الأمر، وعند استخدام صيغة <code>(COMMAND)$</code> فإن كل المحارف بين القوسين تُعد مكونة للأمر ولا يعامل أي منها بشكل خاص. كذلك يمكن أن تتداخل إحلالات الأوامر، ولكي تصنع تداخلًا أثناء استخدام صيغة الاقتباس الخلفي، اسبق الفواصل العليا المائلة بشَرّط مائلة خلفية.
  
أول فاصلة عليا مائلة غير مسبوقة بشرطة خلفية مائلة تنهي إحلال الأمر. عند استخدام صيغة "(COMMAND)$" فإن كل المحارف بين القوسين تكوّن الأمر، ولا يعامل أي منها بشكل خاص.
+
لا تنقسم الكلمات إن ظهر الإحلال بين علامتي اقتباس مزدوجة، وتوسَّع أسماء الملفات على النتائج.
 +
==التوسع الحسابي==
 +
يسمح التوسع الحسابي بتقييم تعبير حسابي وإحلال نتيجته، وصيغة التوسع الحسابي هي <code>((التعبير الحسابي))$</code>، ويعامل التعبير كما لو كان بين علامات اقتباس مزدوجة، لكن لا تُعامل علامة الاقتباس المزدوجة داخل القوسين . وتخضع كل الوحدات داخل التعبير لتوسع المعامل وإحلال الأمر وإزالة الاقتباس، كما يمكن أن تتداخل الإحلالات الحسابية.
  
يمكن أن تتداخل إحلالات الأوامر، ولكي تصنع تداخلًا أثناء استخدام هيئة التنصيص الخلفي، اسبق الفواصل العليا المائلة بشَرّط مائلة خلفية.
+
يتم تقييم التعبيرات الحسابية في أرقام ثابتة العرض (fixed-width integers) بدون تفقد للفائض رغم أن القسمة على الصفر تُلتقط وتعرّف على أنها خطأ، والمعامِلات (operators) هي نفسها تقريبًا التي في لغة C البرمجية. ومن أجل تقليل الأولوية فإن القائمة تكون مشابهة لهذه:
  
إن ظهر الإحلال بين علامتي تنصيص مزدوجة فلا يتم تنفيذ انقسام الكلمات وتوسع أسماء الملفات على النتائج.
+
'''جدول 3.4 : المعاملات الحسابية'''
 
 
== التوسع الحسابي ==
 
يسمح التوسع الحسابي بتقييم تعبير حسابي وإحلال النتيجة، وصيغة التوسع الحسابي هي:
 
 
 
((التعبير الحسابي))$
 
 
 
يعامل التعبير كما لو كان بين علامات تنصيص مزدوجة، لكن علامة تنصيص مزدوجة داخل القوسين لا تعامل بشكل خاص. كل الوحدات داخل التعبير تخضع لتوسع المعامل وإحلال الأمر وإزالة التنصيص. يمكن أن تتداخل الإحلالات الحسابية.
 
 
 
يتم تقييم التعبيرات الحسابية في أرقام ثابتة العرض بدون تفقد للفائض رغم أن القسمة على الصفر تحصر وتعرّف على أنها خطأ، والمعاملات هي نفسها التي في لغة C البرمجية. ولتقليل الأولوية تشبه القائمة شيئًا كهذا:
 
 
 
جدول 3.4 : المعاملات الحسابية
 
 
{| class="wikitable"
 
{| class="wikitable"
|المعامِل
+
|'''المعامِل'''
|المعنى
+
|'''المعنى'''
 
|-
 
|-
|<nowiki>++VAR و --VAR</nowiki>
+
|<code>++VAR</code> و <code>--VAR</code>
 
|الزيادة اللاحقة للمتغير والتناقص اللاحق له
 
|الزيادة اللاحقة للمتغير والتناقص اللاحق له
 
|-
 
|-
|VAR++ و VAR--
+
|<code>VAR++</code> و <code>VAR--</code>
 
|الزيادة السابقة للمتغير والتناقص السابق له
 
|الزيادة السابقة للمتغير والتناقص السابق له
 
|-
 
|-
|<nowiki>- و +</nowiki>
+
|<code>-</code> و <code>+</code>
 
|إشارتي ناقص وزائد أحاديتين
 
|إشارتي ناقص وزائد أحاديتين
 
|-
 
|-
|! و ~
+
|<code>!</code> و <code>~</code>
 
|النفي المنطقي (Logical Negation) والنفي البِتِّي (Bitwise Negation)
 
|النفي المنطقي (Logical Negation) والنفي البِتِّي (Bitwise Negation)
 
|-
 
|-
|**
+
|<code>**</code>
 
|الأُسِّية -رفع القوة الجبرية-
 
|الأُسِّية -رفع القوة الجبرية-
 
|-
 
|-
|*و / و %
+
|<code>*</code> و <code>/</code> و <code>%</code>
 
|الضرب والقسمة والباقي (remainder)
 
|الضرب والقسمة والباقي (remainder)
 
|-
 
|-
|<nowiki>+ و -</nowiki>
+
|<code>+</code> و <code>-</code>
 
|الجمع والطرح
 
|الجمع والطرح
 
|-
 
|-
|<< و >>
+
|<code><<</code> و <code>>></code>
 
|النقلات البِتِّية (bitwise shifts) -على مستوى البِتّ bit- لليمين واليسار
 
|النقلات البِتِّية (bitwise shifts) -على مستوى البِتّ bit- لليمين واليسار
 
|-
 
|-
|<= و >= و < و >
+
|<code><=</code> و <code>>=</code> و <code><</code> و <code>></code>
 
|معامِلات المقارنة
 
|معامِلات المقارنة
 
|-
 
|-
|== و !=
+
|<code>==</code> و <code>!=</code>
 
|التساوي وعدم التساوي
 
|التساوي وعدم التساوي
 
|-
 
|-
|&
+
|<code>&</code>
 
|بوابة AND البِتِّية
 
|بوابة AND البِتِّية
 
|-
 
|-
|^
+
|<code>^</code>
 
|بوابة OR البِتِّية الحصرية
 
|بوابة OR البِتِّية الحصرية
 
|-
 
|-
|<nowiki>|</nowiki>
+
|<code><nowiki>|</nowiki></code>
 
|بوابة OR البِتِّية
 
|بوابة OR البِتِّية
 
|-
 
|-
|&&
+
|<code>&&</code>
 
|بوابة AND
 
|بوابة AND
 
|-
 
|-
|<nowiki>||</nowiki>
+
|<code><nowiki>||</nowiki></code>
 
|بوابة OR
 
|بوابة OR
 
|-
 
|-
|expr ? expr : expr
+
|<code>expr ?</code> <code>expr :</code> <code>expr</code>
 
|التقييم الشرطي
 
|التقييم الشرطي
 
|-
 
|-
|<nowiki>= و *= و /= و %= و += و -= و <<= و >>= و &= و ^= و |=</nowiki>
+
|<code>=</code> و <code>*=</code> و <code>/=</code> و <code>%=</code> و <code>+=</code> و <code>-=</code> و <code><<=</code> و <code>>>=</code> و <code>&=</code> و <code>^=</code> و <code><nowiki>|=</nowiki></code>
 
|التعيينات
 
|التعيينات
 
|-
 
|-
|,
+
|<code>,</code>
 
|الفاصلة التي تفصل بين التعبيرات
 
|الفاصلة التي تفصل بين التعبيرات
|}
+
|}قد يُشار إلى متغيرات الصدفة بالاسم داخل التعبير دون استخدام بنية التوسع اللغوية، وتُقيَّم قيمة المتغير كتعبير حسابي حين يشار إليها. كذلك يُسمح بمتغيرات الصدفة كعوامل (operands)، ولا يحتاج متغير الصدفة أن يكون وسيطه الرقمي (integer attribute)
يُسمح بمتغيرات الصدفة كعوامل (operands)، ويُنفَّذ توسع المعامِل قبل تقييم التعبير، وقد يشار إلى متغيرات الصدفة بالاسم داخل التعبير دون استخدام البنية اللغوية للتوسع، وتقيَّم قيمة المتغير كتعبيرة حسابي حين يشار إليها، لا يحتاج متغير الصدفة أن يكون وسيطه الرقمي (integer attribute) نشطًا حين يشار إليه.
+
 
 +
يُسمح بمتغيرات الصدفة كعوامل (operands) ويُنفَّذ توسع المعامِل قبل تقييم التعبير، وقد يشار إلى متغيرات الصدفة بالاسم داخل التعبير دون استخدام البنية اللغوية (syntax) للتوسع، وتقيَّم قيمة المتغير كتعبير حسابي حين يشار إليها، لا يحتاج متغير الصدفة أن يكون وسيطه الرقمي (integer attribute) نشطًا حين يشار إليه.
  
 
الثوابت التي تبدأ بصفر تُفسر كأرقام ثُمانيّة (وفق النظام الثماني)، أما 0x أو 0X فتدل على النظام السداسي العشري (hexadecimal)، وخلافًا لذلك فإن الأرقام تأخذ صيغة "BASE'#']N]" حيث يكون "BASE" رقمًا عشريًا بين 2 و64 ممثلًا القاعدة الحسابية، و N هو رقم في تلك القاعدة.
 
الثوابت التي تبدأ بصفر تُفسر كأرقام ثُمانيّة (وفق النظام الثماني)، أما 0x أو 0X فتدل على النظام السداسي العشري (hexadecimal)، وخلافًا لذلك فإن الأرقام تأخذ صيغة "BASE'#']N]" حيث يكون "BASE" رقمًا عشريًا بين 2 و64 ممثلًا القاعدة الحسابية، و N هو رقم في تلك القاعدة.
سطر 167: سطر 138:
 
8760
 
8760
 
</syntaxhighlight>انظر المقارنات الرقمية في [[Bash/introduction to if|مقدمة إلى if في Bash]] لترى أمثلة عملية في برامج الصدفة.
 
</syntaxhighlight>انظر المقارنات الرقمية في [[Bash/introduction to if|مقدمة إلى if في Bash]] لترى أمثلة عملية في برامج الصدفة.
 
+
==إحلال العمليات==
== إحلال العمليات ==
 
 
إحلال العمليات مدعوم في الأنظمة التي تدعم الأنابيب المسماة (FIFOs) أو أسلوب dev/fd/ في تسمية الملفات، وتكون صيغته كالتالي:
 
إحلال العمليات مدعوم في الأنظمة التي تدعم الأنابيب المسماة (FIFOs) أو أسلوب dev/fd/ في تسمية الملفات، وتكون صيغته كالتالي:
  
سطر 182: سطر 152:
  
 
كلما أمكن، يُنفذ إحلال العمليات بالتزامن مع توسع المعامل والمتغير، وإحلال الأوامر والتوسع الحسابي. انظر إعادة التوجيه وواصفات الملفات في الحصول على مُدخلات المستخدم في Bash.
 
كلما أمكن، يُنفذ إحلال العمليات بالتزامن مع توسع المعامل والمتغير، وإحلال الأوامر والتوسع الحسابي. انظر إعادة التوجيه وواصفات الملفات في الحصول على مُدخلات المستخدم في Bash.
 
+
==انقسام الكلمات==
== انقسام الكلمات ==
+
تمسح الصدفة نتائج توسع المعامل وإحلال الأوامر، والتوسع الحسابي الذي لم يحدث داخل علامتي اقتباس مزدوجتين بحثًا عن انقسام الكلمات.
تمسح الصدفة نتائج توسع المعامل وإحلال الأوامر، والتوسع الحسابي الذي لم يحدث داخل علامتي تنصيص مزدوجتين بحثًا عن انقسام الكلمات.
 
  
 
وتعامل الصدفة كل محرف من IFS$ كمحرف محدد، وتقسم النتائج للتوسعات الأخرى في كلمات عن تلك المحارف، وإن لم يُضبط IFS أو كانت قيمته الافتراضية هي "'<سطر جديد><جدول(tab)><مسافة>'" فإن أي تسلسل لمحارف IFS يعمل لتحديد الكلمات. إن كان IFS له قيمة خلاف الافتراضية فيتم تجاهل تسلسل محارف المسافات البيضاء "المسافة" و"الجدول(tab)" في بداية ونهاية الكلمة، طالما أن محرف المسافة البيضاء يكون في قيمة IFS (محرف مسافة بيضاء لمتغير IFS).
 
وتعامل الصدفة كل محرف من IFS$ كمحرف محدد، وتقسم النتائج للتوسعات الأخرى في كلمات عن تلك المحارف، وإن لم يُضبط IFS أو كانت قيمته الافتراضية هي "'<سطر جديد><جدول(tab)><مسافة>'" فإن أي تسلسل لمحارف IFS يعمل لتحديد الكلمات. إن كان IFS له قيمة خلاف الافتراضية فيتم تجاهل تسلسل محارف المسافات البيضاء "المسافة" و"الجدول(tab)" في بداية ونهاية الكلمة، طالما أن محرف المسافة البيضاء يكون في قيمة IFS (محرف مسافة بيضاء لمتغير IFS).
سطر 190: سطر 159:
 
وأي محرف في متغير IFS ليس محرف مسافة بيضاء بالإضافة إلى أي محارف مسافات بيضاء لـ IF قريبة فإنها تحدد حقلًا، ويعامل تسلسل محارف المسافات البيضاء لمتغير IFS كمحدِّد، وإن كانت قيمة IFS فارغة فلا يحدث انقسام للكلمات.
 
وأي محرف في متغير IFS ليس محرف مسافة بيضاء بالإضافة إلى أي محارف مسافات بيضاء لـ IF قريبة فإنها تحدد حقلًا، ويعامل تسلسل محارف المسافات البيضاء لمتغير IFS كمحدِّد، وإن كانت قيمة IFS فارغة فلا يحدث انقسام للكلمات.
  
الوسائط الفارغة الصريحة ("""" أو "<nowiki>''</nowiki>") يُحتفظ بها، وتحذف الوسائط الضمنية غير المنصصة الناتجة من توسع المعاملات التي ليس لها قيم. إن توسع معامل ليس له قيم بين علامتي تنصيص مزدوجتين فإن نصًا فارغًا ينتج ويُحتفظ به.<blockquote>'''التوسع وانقسام الكلمات'''</blockquote><blockquote>إن لم يحدث توسع فلا يُنفذ أي انقسام.</blockquote>
+
الوسائط الفارغة الصريحة ("""" أو "<nowiki>''</nowiki>") يُحتفظ بها، وتحذف الوسائط الضمنية غير المنصصة الناتجة من توسع المعاملات التي ليس لها قيم. إن توسع معامل ليس له قيم بين علامتي اقتباس مزدوجتين فإن نصًا فارغًا ينتج ويُحتفظ به.<blockquote>'''التوسع وانقسام الكلمات'''</blockquote><blockquote>إن لم يحدث توسع فلا يُنفذ أي انقسام.</blockquote>
 
+
==توسع أسماء الملفات==
== توسع أسماء الملفات ==
 
 
تمسح Bash كل كلمة بعد انقسام الكلمات -ما لم يُحدد خيار f- (انظر [[Bash/debugging Bash scripts#.D8.AA.D9.86.D9.82.D9.8A.D8.AD .D8.A3.D8.AC.D8.B2.D8.A7.D8.A1 .D9.85.D9.86 .D8.A7.D9.84.D8.B5.D8.AF.D9.81.D8.A9|تنقيح أجزاء من الصدفة]])- بحثًا عن محارف * و ? و ] ، فإن لم يظهر أي من تلك المحارف فتُعد الكلمة نمطًا (PATTERN) وتستبدل بقائمة من أسماء الملفات الموافقة للنمط مرتبة أبجديًا.
 
تمسح Bash كل كلمة بعد انقسام الكلمات -ما لم يُحدد خيار f- (انظر [[Bash/debugging Bash scripts#.D8.AA.D9.86.D9.82.D9.8A.D8.AD .D8.A3.D8.AC.D8.B2.D8.A7.D8.A1 .D9.85.D9.86 .D8.A7.D9.84.D8.B5.D8.AF.D9.81.D8.A9|تنقيح أجزاء من الصدفة]])- بحثًا عن محارف * و ? و ] ، فإن لم يظهر أي من تلك المحارف فتُعد الكلمة نمطًا (PATTERN) وتستبدل بقائمة من أسماء الملفات الموافقة للنمط مرتبة أبجديًا.
  
سطر 202: سطر 170:
  
 
ويتم تجاهل . و .. كأسماء ملفات حتى لو ضُبط GLOBIGNORE، لكن على أي حال فإن ضبط GLOBIGNORE له تأثير تفعيل خيار dotglob، لذا ستطابِق كل أسماء الملفات الأخرى التي تبدأ بـ . ، وللحصول على السلوك القديم لتجاهل أسماء الملفات التي تبدأ بـ . ، اجعل "*." أحد الأنماط في GLOBIGNORE. يُعطَّل خيار dotglob عند إلغاء ضبط GLOBEIGNORE.
 
ويتم تجاهل . و .. كأسماء ملفات حتى لو ضُبط GLOBIGNORE، لكن على أي حال فإن ضبط GLOBIGNORE له تأثير تفعيل خيار dotglob، لذا ستطابِق كل أسماء الملفات الأخرى التي تبدأ بـ . ، وللحصول على السلوك القديم لتجاهل أسماء الملفات التي تبدأ بـ . ، اجعل "*." أحد الأنماط في GLOBIGNORE. يُعطَّل خيار dotglob عند إلغاء ضبط GLOBEIGNORE.
 +
 +
<span> </span>
  
 
<span> </span>
 
<span> </span>

مراجعة 11:42، 16 أغسطس 2018


بعد تقسيم الأمر في Bash إلى وحدات (Tokens) -انظر وحدات البناء الأساسية في Bash، البنية اللغوية للصدفة- فإن تلك الوحدات توسَّع (expanded) أو تُحَلّ (resolved)، وسنفصّل الآن تلك التوسعات وفقًا لترتيب كل منها، ثم بعد إتمام جميع التوسعات تُنفّذ عملية حذف الاقتباسات.

توسُّع القوس المعقوف {}

توسع القوس المعقوف هو آلية يمكن من خلالها إنشاء نصوص عشوائية (arbitrary strings)، إذ تأخذ الأنماط (patterns) التي سيُنفَّذ عليها توسع القوس المعقوف باستهلال اختياري (optional preamble) متبوع بسلسلة من النصوص تفصل بين كل منها فاصلة، وتكون تلك النصوص بين قوسين معقوفين {} ثم تأتي بعد ذلك حاشية (postscript) اختيارية أيضًا. ويوضع الاستهلال في بداية كل نص داخل القوس -بعد التوسع- ثم تُلحَق الحاشية بنهاية كل نص أيضًا، وذلك بالترتيب من اليسار إلى اليمين.

قد تتداخل توسعات القوس المعقوف لكن ذلك لا يعني أن النتائج يمكن تصنيفها، بل يظل الترتيب كما هو من اليسار إلى اليمين، انظر المثال التالي للتوضيح:

hsoub ~> echo sp{el,il,al}l
spell spill spall

يُنفَّذ توسع القوس المعقوف قبل أي توسع آخر، ويُحتفظ في النتيجة بأي محارف ذات معاني خاصة بالنسبة للتوسعات الأخرى، ذلك أن هذ التوسع نصي حصرًا فلا تفسر Bash البنية اللغوية لسياق التوسع ولا للنص الذي بين القوسين المعقوفين. كذلك فإن النص }$ ليس صالحًا لتوسع القوس المعقوف من أجل تجنب التعارض الذي قد يحدث.

ويجب أن يحتوي توسع القوس المعقوف على قوسين معقوفيْن بدون علامات اقتباس حول أي منهما وفاصلة , واحدة على الأقل لا تكون بين علامات اقتباس أيضًا، وأي توسّع للقوس المعقوف يكون على خلاف تلك الصيغة فإنه يُترك دون تغيير.

توسع المَدَّة (~)

إن بدأت كلمة بمحرف المَدَّة ~ دون علامات اقتباس فإن كل المحارف حتى أول شرطة مائلة / بدون علامات اقتباس -أو كل المحارف إن لم توجد شرطة مائلة بدون علامات اقتباس- تُعد مقدمة للمدَّة (tilde-prefix) ، وتُعامل المحارف التي تأتي بعد المدة في مقدمة المدة (tilde-prefix) على أنها اسم لتسجيل الدخول، وذلك إن لم يوضع أي محرف من محارف مقدمة المَدَّة داخل علامتي اقتباس، فإن كان اسم تسجيل الدخول ذاك فارغًا فإن المدة تُستبدل بقيمة متغير HOME، فإن كان متغير HOME غير مضبوط على أي قيمة فإن مجلد home الخاص بالمستخدم الذي يُنفّذ الصدفةَ يُستخدم مكانه، وإلا فإن مقدمة المَدة تُستبدل بمجلد المنزل المرتبط باسم تسجيل الدخول.

إن كانت مقدمة المدة هي +~ فإن قيمة المتغير PWD تحل محلها، أما إن كانت مقدمة المدة -~ فإن قيمة المتغير OLDPWD هي التي تحل محلها، في حال ضبط قيمة ما لذلك المتغير. وإن كانت المحارف التي تلي المدة في مقدمة المدة تتكون من عدد N (قد) يسبقه + أو - فإن مقدمة المدة تُستبدل بالعنصر الذي يماثلها من مكدس المجلدات (Directory Stack)، كما سيُعرض كوسيط في أمر dirs الذي تستدعيه المحارف التي تلي المَدّة في مقدمة المدة، فإن كانت المحارف التي تلي المَدة تتكون من عدد بدون إشارة موجب أو سالب قبله فسيُفترض أن هذا العدد موجب. كذلك إن كان اسم تسجيل الدخول غير صالح، أو فشلَ توسع المدة فإن الكلمة تترك دون تغيير.

تُفحص تعيينات المتغيرات بعد : أو = مباشرة بحثًا عن مقدمات للمدة لا تكون بين علامات اقتباس، وتُوسّع المدة في تلك الحالات، وعليه يمكن استخدام أسماء ملفات فيها محرف المدة في التعيينات التي تكون لمتغيرات PATH و MAILPATH و CDPATH، وتُعيّن الصدفة القيمةَ الموسعة.

مثال:

hsoub ~> export PATH="$PATH:~/testdir"

سيوسَّع testdir/~ إلى HOME/testdir$، لذا إن كان HOME$ هو var/home/hsoub/ فإن مجلد var/home/hsoub/testdir/ يضاف إلى محتويات متغير PATH.

معامل الصدفة وتوسع المتغير

يسبق محرف $ توسع المعامِل (parameter expansion) وإحلال الأوامر (command substitution) والتوسعات الحسابية (arithmetic expansion)، قد يكون اسم المعامِل الذي سيوسَّع -أو رمزه- بين قوسين معقوفيْن وذلك اختياري لكنه يحمي المتغير الذي سيوسَّع من المحارف التي تليه والتي قد تُفسر على أنها جزء من الاسم. وحين تُستخدم الأقواس المعقوفة فإن الطرف الثاني من القوس هو أول { غير مهرَّب بواسطة شرطة مائلة خلفية \ أو بين نص مقتبَس أو داخل توسع حسابي مضمَّن (embedded arithmetic expansion) أو أمر تم إحلاله أو توسُّع لمعامِل.

والصورة الأساسية لتوسع المعامِل هي {PARAMETER}$، وتُستبدل قيمة PARAMETER، وتكون الأقواس ضرورية حين يكون PARAMETER معامِلًا موضعيًا بأكثر من رقم واحد أو حين يُتبع PARAMETER بمحرَف لن يُفسر كجزء من الاسم.

وإن كان أول محرف من المعامِل PARAMETER علامة تعجب فإن Bash تستخدم قيمة المتغير المتكون من بقية PARAMETER كاسم للمتغير، ويوسَّع ذلك المتغير وتُستخدم تلك القيمة في بقية الاستبدال بدلًا من قيمة PARAMETER نفسه، ويُعرف هذا باسم التوسع غير المباشر، على خلاف التوسع المباشر المنتشر والذي يحدث في أبسط الحالات مثل الحالة السابقة أو هذه الحالة:

hsoub ~> echo $SHELL
/bin/bash

أما المثال التالي فهو لتوسع غير مباشر:

hsoub ~> echo ${!N*}
NNTPPORT NNTPSERVER NPX_PLUGIN_PATH

لاحظ أن هذا يختلف عن *echo $N

تسمح بنية المثال التالي بإنشاء المتغير المذكور إن لم يكن قد أنشئ من قبل: {VAR:=value}$

مثال:

hsoub ~> echo $HSOUB

hsoub ~> echo ${HSOUB:=Hsoub}
Hsoub

قد لا تُعيَّن المعاملات الخاصة -ضمن معاملات موضعية أخرى- بهذه الطريقة. سنناقش استخدام الأقواس المعقوفة في معاملة المتغيرات في المزيد حول المتغيرات في Bash، ستجد معلومات أكثر كذلك في صفحات دليل info.

إحلال الأوامر

يسمح إحلال الأوامر لخرج أمر ما أن يحِل محل الأمر نفسه، ويحدث إحلال الأوامر حين يكون أمر ما على هذه الصورة: (الأمر)$ أو على هذه الصورة باستخدام الفاصلة العليا المائلة `: `الأمر`

تنفّذ Bash التوسع بتنفيذ الأمر واستبدال إحلال الأمر بالخرج العادي للأمر مع حذف أي أسطر جديدة تابعة (trailing newlines)، ولا تُحذف الأسطر الجديدة المضمنة لكن قد تُحذف أثناء انقسام الكلمات.

hsoub ~> echo `date`
Thu Feb 6 10:06:20 CET 2003

تحتفظ الشرطة المائلة الخلفية \ بمعناها الحرفي عند استخدام صيغة الاقتباس الخلفي القديمة للإحلال (backquoted form of substitution)، إلا حين تُتبَع إتباعها بعلامة $ أو ` أو \، وتنهي أول فاصلة عليا مائلة ` (backtick) غير مسبوقة بشرطة خلفية مائلة (backslash) إحلال الأمر، وعند استخدام صيغة (COMMAND)$ فإن كل المحارف بين القوسين تُعد مكونة للأمر ولا يعامل أي منها بشكل خاص. كذلك يمكن أن تتداخل إحلالات الأوامر، ولكي تصنع تداخلًا أثناء استخدام صيغة الاقتباس الخلفي، اسبق الفواصل العليا المائلة بشَرّط مائلة خلفية.

لا تنقسم الكلمات إن ظهر الإحلال بين علامتي اقتباس مزدوجة، وتوسَّع أسماء الملفات على النتائج.

التوسع الحسابي

يسمح التوسع الحسابي بتقييم تعبير حسابي وإحلال نتيجته، وصيغة التوسع الحسابي هي ((التعبير الحسابي))$، ويعامل التعبير كما لو كان بين علامات اقتباس مزدوجة، لكن لا تُعامل علامة الاقتباس المزدوجة داخل القوسين . وتخضع كل الوحدات داخل التعبير لتوسع المعامل وإحلال الأمر وإزالة الاقتباس، كما يمكن أن تتداخل الإحلالات الحسابية.

يتم تقييم التعبيرات الحسابية في أرقام ثابتة العرض (fixed-width integers) بدون تفقد للفائض رغم أن القسمة على الصفر تُلتقط وتعرّف على أنها خطأ، والمعامِلات (operators) هي نفسها تقريبًا التي في لغة C البرمجية. ومن أجل تقليل الأولوية فإن القائمة تكون مشابهة لهذه:

جدول 3.4 : المعاملات الحسابية

المعامِل المعنى
++VAR و --VAR الزيادة اللاحقة للمتغير والتناقص اللاحق له
VAR++ و VAR-- الزيادة السابقة للمتغير والتناقص السابق له
- و + إشارتي ناقص وزائد أحاديتين
! و ~ النفي المنطقي (Logical Negation) والنفي البِتِّي (Bitwise Negation)
** الأُسِّية -رفع القوة الجبرية-
* و / و % الضرب والقسمة والباقي (remainder)
+ و - الجمع والطرح
<< و >> النقلات البِتِّية (bitwise shifts) -على مستوى البِتّ bit- لليمين واليسار
<= و >= و < و > معامِلات المقارنة
== و != التساوي وعدم التساوي
& بوابة AND البِتِّية
^ بوابة OR البِتِّية الحصرية
| بوابة OR البِتِّية
&& بوابة AND
|| بوابة OR
expr ? expr : expr التقييم الشرطي
= و *= و /= و %= و += و -= و <<= و >>= و &= و ^= و |= التعيينات
, الفاصلة التي تفصل بين التعبيرات

قد يُشار إلى متغيرات الصدفة بالاسم داخل التعبير دون استخدام بنية التوسع اللغوية، وتُقيَّم قيمة المتغير كتعبير حسابي حين يشار إليها. كذلك يُسمح بمتغيرات الصدفة كعوامل (operands)، ولا يحتاج متغير الصدفة أن يكون وسيطه الرقمي (integer attribute)

يُسمح بمتغيرات الصدفة كعوامل (operands) ويُنفَّذ توسع المعامِل قبل تقييم التعبير، وقد يشار إلى متغيرات الصدفة بالاسم داخل التعبير دون استخدام البنية اللغوية (syntax) للتوسع، وتقيَّم قيمة المتغير كتعبير حسابي حين يشار إليها، لا يحتاج متغير الصدفة أن يكون وسيطه الرقمي (integer attribute) نشطًا حين يشار إليه.

الثوابت التي تبدأ بصفر تُفسر كأرقام ثُمانيّة (وفق النظام الثماني)، أما 0x أو 0X فتدل على النظام السداسي العشري (hexadecimal)، وخلافًا لذلك فإن الأرقام تأخذ صيغة "BASE'#']N]" حيث يكون "BASE" رقمًا عشريًا بين 2 و64 ممثلًا القاعدة الحسابية، و N هو رقم في تلك القاعدة.

وإن أُهمل الرقم الممثل للقاعدة الحسابية فيستخدم رقم 10 افتراضيًا، والأرقام الأكبر من 9 تُمثَّل بأحرف في الحالة الصغرى (lowercase)، والكبرى (uppercase)، و@، و _ ، بذلك الترتيب. أما إن كان "BASE" أقل من أو يساوي 36 فيمكن استخدام أحرف من الحالتين بالتبادل لتمثيل أرقام بين 10 و35.

تُقيَّم المعامِلات بأولوية الترتيب، والتعبيرات الفرعية في الأقواس تقيم أولًا وقد تلغي قاعدة الأسبقية المذكورة قبل قليل.

وينبغي على مستخدمي Bash أن يجربوا استخدام البنية اللغوية للتعبير باستخدام أقواس مربعة كلما أمكن:

[التعبير]$

لكن على أي حال فهذا سيحسب نتيجة التعبير فقط، ولا يجري أي اختبارات:

hsoub ~> echo $[365*24]
8760

انظر المقارنات الرقمية في مقدمة إلى if في Bash لترى أمثلة عملية في برامج الصدفة.

إحلال العمليات

إحلال العمليات مدعوم في الأنظمة التي تدعم الأنابيب المسماة (FIFOs) أو أسلوب dev/fd/ في تسمية الملفات، وتكون صيغته كالتالي:

(LIST)>

أو

(LIST)<

تجري عملية LIST بوجود مدخلاتها ومخرجاتها إلى FIFO أو ملف ما في dev/fd/، ويُمرر اسم هذا الملف كوسيط إلى الأمر الحالي كنتيجة للتوسع.

إن استُخدمَت صيغة "(LIST)<" فإن الكتابة إلى الملف ستزود القائمة LIST بمدخلات، أما إن استُخدِمت صيغة "(LIST)>" فإن الملف الذي مُرِّر كوسيط يجب أن يُقرأ للحصول على خرج القائمة LIST. لاحظ أنه يجب ألا تظهر مسافات بين علامات < أو > و القوس الأيسر، وإلا فإن البنية ستفسر على أنها إعادة توجيه.

كلما أمكن، يُنفذ إحلال العمليات بالتزامن مع توسع المعامل والمتغير، وإحلال الأوامر والتوسع الحسابي. انظر إعادة التوجيه وواصفات الملفات في الحصول على مُدخلات المستخدم في Bash.

انقسام الكلمات

تمسح الصدفة نتائج توسع المعامل وإحلال الأوامر، والتوسع الحسابي الذي لم يحدث داخل علامتي اقتباس مزدوجتين بحثًا عن انقسام الكلمات.

وتعامل الصدفة كل محرف من IFS$ كمحرف محدد، وتقسم النتائج للتوسعات الأخرى في كلمات عن تلك المحارف، وإن لم يُضبط IFS أو كانت قيمته الافتراضية هي "'<سطر جديد><جدول(tab)><مسافة>'" فإن أي تسلسل لمحارف IFS يعمل لتحديد الكلمات. إن كان IFS له قيمة خلاف الافتراضية فيتم تجاهل تسلسل محارف المسافات البيضاء "المسافة" و"الجدول(tab)" في بداية ونهاية الكلمة، طالما أن محرف المسافة البيضاء يكون في قيمة IFS (محرف مسافة بيضاء لمتغير IFS).

وأي محرف في متغير IFS ليس محرف مسافة بيضاء بالإضافة إلى أي محارف مسافات بيضاء لـ IF قريبة فإنها تحدد حقلًا، ويعامل تسلسل محارف المسافات البيضاء لمتغير IFS كمحدِّد، وإن كانت قيمة IFS فارغة فلا يحدث انقسام للكلمات.

الوسائط الفارغة الصريحة ("""" أو "''") يُحتفظ بها، وتحذف الوسائط الضمنية غير المنصصة الناتجة من توسع المعاملات التي ليس لها قيم. إن توسع معامل ليس له قيم بين علامتي اقتباس مزدوجتين فإن نصًا فارغًا ينتج ويُحتفظ به.

التوسع وانقسام الكلمات

إن لم يحدث توسع فلا يُنفذ أي انقسام.

توسع أسماء الملفات

تمسح Bash كل كلمة بعد انقسام الكلمات -ما لم يُحدد خيار f- (انظر تنقيح أجزاء من الصدفة)- بحثًا عن محارف * و ? و ] ، فإن لم يظهر أي من تلك المحارف فتُعد الكلمة نمطًا (PATTERN) وتستبدل بقائمة من أسماء الملفات الموافقة للنمط مرتبة أبجديًا.

فإن لم ييوجد أي اسم مطابق وكان خيار الصدفة nullglob معطلًا فإن الكلمة تترك كما هي. وإن ضُبط خيار nullglob ولم توجد تطابقات فإن الكلمة تُحذف. وإن كان خيار nocaseglob مفعلًا فيُنفَّذ التطابق دون النظر لحالة المحارف الأبجدية.

وحين يُستخدم نمط لتوليد اسم ملف فإن محرف . في بداية اسم الملف أو بعد شرطة مائلة مباشرة يجب أن يُطابَق صراحة ما لم يحدد خيار dotglob. وعند مطابقة اسم ملف يجب أن تطابَق الشرطة المائلة دومًا صراحةً. قد لا تُعامل . بشكل خاص في بعض الحالات.

قد يُستخدم متغير GLOBIGNORE لتقييد مجموعة أسماء الملفات المطابقة لنمط ما، وإن ضُبط GLOBEIGNORE فإن كل اسم ملف مطابق ويطابق أيضًا أحد الأنماط في GLOBIGNORE يُحذف من قائمة المطابِقات.

ويتم تجاهل . و .. كأسماء ملفات حتى لو ضُبط GLOBIGNORE، لكن على أي حال فإن ضبط GLOBIGNORE له تأثير تفعيل خيار dotglob، لذا ستطابِق كل أسماء الملفات الأخرى التي تبدأ بـ . ، وللحصول على السلوك القديم لتجاهل أسماء الملفات التي تبدأ بـ . ، اجعل "*." أحد الأنماط في GLOBIGNORE. يُعطَّل خيار dotglob عند إلغاء ضبط GLOBEIGNORE.