الفرق بين المراجعتين لصفحة: «Bash/variables»

من موسوعة حسوب
إضافة: إدخال محتوى 2.3
 
(9 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:المتغيرات في Bash}}</noinclude>
<noinclude>{{DISPLAYTITLE:المتغيرات في Bash}}</noinclude>
 
== أنواع المتغيرات ==
أنواع المتغيرات
 
تُكتب متغيرات الصدفة بحروف إنجليزية كبيرة، وتحتفظ Bash بقائمة من نوعين من المتغيرات:
تُكتب متغيرات الصدفة بحروف إنجليزية كبيرة، وتحتفظ Bash بقائمة من نوعين من المتغيرات:


المتغيرات العامة Global Variables
=== المتغيرات العامة Global Variables ===
 
ستجد المتغيرات العامة أو متغيرات البيئة (environment variables) في جميع الصدفات، ويمكن استخدام أوامر <code>env</code> أو <code>printenv</code> لعرض متغيرات البيئة، وتأتي تلك البرامج في حزمة <code>sh-utils</code>. إليك مثالًا لخرج أمر <code>printenv</code>:
ستجد المتغيرات العامة أو متغيرات البيئة (environment variables) في جميع الصدفات، ويمكن استخدام أوامر env أو printenv لعرض متغيرات البيئة، وتأتي تلك البرامج في حزمة sh-utils. إليك مثالًا لخرج أمر printenv:<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
hsoub ~> printenv
wiki ~> printenv
CC=gcc
CC=gcc
CDPATH=.:~:/usr/local:/usr:/
CDPATH=.:~:/usr/local:/usr:/
سطر 24: سطر 22:
GDMSESSION=Default
GDMSESSION=Default
GNOME_DESKTOP_SESSION_ID=Default
GNOME_DESKTOP_SESSION_ID=Default
GTK_RC_FILES=/etc/gtk/gtkrc:/nethome/hsoub/.gtkrc-1.2-gnome2
GTK_RC_FILES=/etc/gtk/gtkrc:/nethome/wiki/.gtkrc-1.2-gnome2
GWMCOLOR=darkgreen
GWMCOLOR=darkgreen
GWMTERM=xterm
GWMTERM=xterm
سطر 30: سطر 28:
history_control=ignoredups
history_control=ignoredups
HISTSIZE=2000
HISTSIZE=2000
HOME=/nethome/hsoub
HOME=/nethome/wiki
HOSTNAME=octarine.hq.garrels.be
HOSTNAME=hsoub.hq.garrels.be
INPUTRC=/etc/inputrc
INPUTRC=/etc/inputrc
IRCNAME=hsoub
IRCNAME=wiki
JAVA_HOME=/usr/java/j2sdk1.4.0
JAVA_HOME=/usr/java/j2sdk1.4.0
LANG=en_US
LANG=en_US
سطر 42: سطر 40:
LESSOPEN=|/usr/bin/lesspipe.sh %s
LESSOPEN=|/usr/bin/lesspipe.sh %s
LEX=flex
LEX=flex
LOCAL_MACHINE=octarine
LOCAL_MACHINE=hsoub
LOGNAME=hsoub
LOGNAME=wiki
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
MACHINES=octarine
MACHINES=hsoub
MAILCHECK=60
MAILCHECK=60
MAIL=/var/mail/hsoub
MAIL=/var/mail/wiki
MANPATH=/usr/man:/usr/share/man/:/usr/local/man:/usr/X11R6/man
MANPATH=/usr/man:/usr/share/man/:/usr/local/man:/usr/X11R6/man
MEAN_MACHINES=octarine
MEAN_MACHINES=hsoub
MOZ_DIST_BIN=/usr/lib/mozilla
MOZ_DIST_BIN=/usr/lib/mozilla
MOZILLA_FIVE_HOME=/usr/lib/mozilla
MOZILLA_FIVE_HOME=/usr/lib/mozilla
سطر 58: سطر 56:
NNTPSERVER=news
NNTPSERVER=news
NPX_PLUGIN_PATH=/plugin/ns4plugin/:/usr/lib/netscape/plugins
NPX_PLUGIN_PATH=/plugin/ns4plugin/:/usr/lib/netscape/plugins
OLDPWD=/nethome/hsoub
OLDPWD=/nethome/wiki
OS=Linux
OS=Linux
PAGER=less
PAGER=less
PATH=/nethome/hsoub/bin.Linux:/nethome/hsoub/bin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:/usr/bin:/usr/sbin:/bin:/sbin:.
PATH=/nethome/wiki/bin.Linux:/nethome/wiki/bin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:/usr/bin:/usr/sbin:/bin:/sbin:.
PS1=\[\033[1;44m\]hsoub is in \w\[\033[0m\]
PS1=\[\033[1;44m\]wiki is in \w\[\033[0m\]
PS2=More input>
PS2=More input>
PWD=/nethome/hsoub
PWD=/nethome/wiki
SESSION_MANAGER=local/octarine.hq.garrels.be:/tmp/.ICE-unix/22106
SESSION_MANAGER=local/hsoub.hq.garrels.be:/tmp/.ICE-unix/22106
SHELL=/bin/bash
SHELL=/bin/bash
SHELL_LOGIN=--login
SHELL_LOGIN=--login
سطر 75: سطر 73:
TERM=xterm
TERM=xterm
TYPE=type
TYPE=type
USERNAME=hsoub
USERNAME=wiki
USER=hsoub
USER=wiki
_=/usr/bin/printenv
_=/usr/bin/printenv
VISUAL=vi
VISUAL=vi
WINDOWID=20971661
WINDOWID=20971661
XAPPLRESDIR=/nethome/hsoub/app-defaults
XAPPLRESDIR=/nethome/wiki/app-defaults
XAUTHORITY=/nethome/hsoub/.Xauthority
XAUTHORITY=/nethome/wiki/.Xauthority
XENVIRONMENT=/nethome/hsoub/.Xdefaults
XENVIRONMENT=/nethome/wiki/.Xdefaults
XFILESEARCHPATH=/usr/X11R6/lib/X11/%L/%T/%N%C%S:/usr/X11R6/lib/X11/%l/%T/%N%C%S:/usr/X11R6/lib/X11/%T/%N%C%S:/usr/X11R6/lib/X11/%L/%T/%N%S:/usr/X11R6/lib/X11/%l/%T/%N%S:/usr/X11R6/lib/X11/%T/%N%S
XFILESEARCHPATH=/usr/X11R6/lib/X11/%L/%T/%N%C%S:/usr/X11R6/lib/X11/%l/%T/%N%C%S:/usr/X11R6/lib/X11/%T/%N%C%S:/usr/X11R6/lib/X11/%L/%T/%N%S:/usr/X11R6/lib/X11/%l/%T/%N%S:/usr/X11R6/lib/X11/%T/%N%S
XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB
XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB
سطر 90: سطر 88:
X=X11R6
X=X11R6
YACC=bison -y
YACC=bison -y
</syntaxhighlight>المتغيرات المحلية Local Variables
</syntaxhighlight>


لن تجد المتغيرات المحلية إلا في الصدفة الحالية، ويمكن استخدام أمر set -بدون خيارات- لعرض قائمة بكل الدوال والمتغيرات -بما في ذلك متغيرات البيئة-، ويُصنَّف الخَرْج وفقًا للموضع الحالي ويُعرض كذلك في صيغة يمكن إعادة استخدامها.
=== المتغيرات المحلية Local Variables ===
لن تجد المتغيرات المحلية إلا في الصدفة الحالية، ويمكن استخدام أمر <code>set</code> -بدون خيارات- لعرض قائمة بكل الدوال والمتغيرات -بما في ذلك متغيرات البيئة-، ويُصنَّف الخَرْج وفقًا للموضع الحالي ويُعرض كذلك في صيغة يمكن إعادة استخدامها.


وإليك مثالًا لملف diff أُنشئ من مقارنة خَرجيْ الأمرين printenv و set ، بعد استثناء الدوال التي يمكن عرضها باستخدام أمر set أيضًا:<syntaxhighlight lang="bash">
وإليك مثالًا لملف diff أُنشئ من مقارنة خَرجيْ الأمرين <code>printenv</code> و <code>set</code> ، بعد استثناء الدوال التي يمكن عرضها باستخدام أمر <code>set</code> أيضًا:<syntaxhighlight lang="bash">


hsoub ~> diff set.sorted printenv.sorted | grep "<" | awk '{ print $2 }'
wiki ~> diff set.sorted printenv.sorted | grep "<" | awk '{ print $2 }'
BASE=/nethome/hsoub/.Shell/hq.garrels.be/octarine.aliases
BASE=/nethome/wiki/.Shell/hq.garrels.be/hsoub.aliases
BASH=/bin/bash
BASH=/bin/bash
BASH_VERSINFO=([0]="2"
BASH_VERSINFO=([0]="2"
سطر 106: سطر 105:
EUID=504
EUID=504
GROUPS=()
GROUPS=()
HERE=/home/hsoub
HERE=/home/wiki
HISTFILE=/nethome/hsoub/.bash_history
HISTFILE=/nethome/wiki/.bash_history
HOSTTYPE=i686
HOSTTYPE=i686
IFS=$'
IFS=$'
سطر 120: سطر 119:
PWD_REAL='pwd
PWD_REAL='pwd
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
THERE=/home/hsoub
THERE=/home/wiki
UID=504
UID=504
</syntaxhighlight>للمزيد عن لغة Awk البرمجية المُستخدمة في المثال السابق، انظر صفحتها على [https://ar.wikipedia.org/wiki/%D8%A3%D9%88%D9%83 ويكيبيديا].
</syntaxhighlight>للمزيد عن لغة Awk البرمجية المُستخدمة في المثال السابق، انظر صفحتها على [https://ar.wikipedia.org/wiki/%D8%A3%D9%88%D9%83 ويكيبيديا].
===تصنيف المتغيرات بناء على محتواها===
===تصنيف المتغيرات بناء على محتواها===
يمكن تصنيف المتغيرات وفقًا لنوع المحتوى الذي يحمله المتغير، وبناءً على ذلك فإن المتغيرات تنقسم إلى أربعة أنواع:
يمكن تصنيف المتغيرات وفقًا لنوع المحتوى الذي يحمله المتغير، وبناءً على ذلك فإن المتغيرات تنقسم إلى أربعة أنواع:
 
* متغيرات نصية.
متغيرات نصية.
* متغيرات عددية.
 
* متغيرات ثابتة.
متغيرات عددية.
* متغيرات المصفوفة.
 
متغيرات ثابتة.
 
متغيرات المصفوفة.
 
ستجد مزيدًا من الشرح عن هذه الأنواع في [[Bash/more on variables|المزيد عن المتغيرات في Bash]]، أما الآن فسنعمل مع قيم عددية ونصية للمتغيرات التي لدينا.
ستجد مزيدًا من الشرح عن هذه الأنواع في [[Bash/more on variables|المزيد عن المتغيرات في Bash]]، أما الآن فسنعمل مع قيم عددية ونصية للمتغيرات التي لدينا.


إنشاء المتغيرات
== إنشاء المتغيرات ==
 
أسماء المتغيرات حساسة لحالة الأحرف، ويُكتب المتغير بأحرف إنجليزية كبيرة افتراضيًا لكن يمكن إعطاء المتغيرات المحلية أسماء بأحرف صغيرة، وفي كل الأحوال فإن لديك الحرية في استخدام الأسماء التي تريدها أو أن تضع حروفًا صغيرة وكبيرة داخل اسم متغير واحد. كذلك فإن المتغيرات يمكن أن تحتوي أرقامًا بشرط ألا يبدأ اسم المتغير برقم:<syntaxhighlight lang="bash">
أسماء المتغيرات حساسة لحالة الأحرف، ويُكتب المتغير بأحرف إنجليزية كبيرة افتراضيًا لكن يمكن إعطاء المتغيرات المحلية أسماء بأحرف صغيرة، وفي كل الأحوال فإن لديك الحرية في استخدام الأسماء التي تريدها أو أن تضع حروفًا صغيرة وكبيرة داخل اسم متغير واحد.
 
كذلك فإن المتغيرات يمكن أن تحتوي أرقامًا بشرط ألا يبدأ اسم المتغير برقم:<syntaxhighlight lang="bash">
prompt> export 1number=1
prompt> export 1number=1
bash: export: `1number=1': not a valid identifier
bash: export: `1number=1': not a valid identifier
سطر 146: سطر 137:
VARNAME="value"
VARNAME="value"
</syntaxhighlight>لكن انتبه، فلا تضع مسافات حول علامتي التنصيص إذ سيتسبب ذلك في أخطاء، لذا من الجيد أن تكتسب عادة اقتباس المحتوى النصي حين تعيّن قِيَمًا لمتغيرات، إذ سيقلل هذا احتمال وقوع الخطأ. إليك بعض الأمثلة على استخدام الأحرف بحالتيها والأرقام والمسافات:<syntaxhighlight lang="bash">
</syntaxhighlight>لكن انتبه، فلا تضع مسافات حول علامتي التنصيص إذ سيتسبب ذلك في أخطاء، لذا من الجيد أن تكتسب عادة اقتباس المحتوى النصي حين تعيّن قِيَمًا لمتغيرات، إذ سيقلل هذا احتمال وقوع الخطأ. إليك بعض الأمثلة على استخدام الأحرف بحالتيها والأرقام والمسافات:<syntaxhighlight lang="bash">
hsoub ~> MYVAR1="2"
wiki ~> MYVAR1="2"


hsoub ~> echo $MYVAR1
wiki ~> echo $MYVAR1
2
2


hsoub ~> first_name="Hsoub"
wiki ~> first_name="Wiki"


hsoub ~> echo $first_name
wiki ~> echo $first_name
Hsoub
Wiki


hsoub ~> full_name="Hsoub Alaraby"
wiki ~> full_name="Wiki Hsoub"


hsoub ~> echo $full_name
wiki ~> echo $full_name
Hsoub Alaraby
Wiki Hsoub


hsoub ~> MYVAR-2="2"
wiki ~> MYVAR-2="2"
bash: MYVAR-2=2: command not found
bash: MYVAR-2=2: command not found


hsoub ~> MYVAR1 ="2"
wiki ~> MYVAR1 ="2"
bash: MYVAR1: command not found
bash: MYVAR1: command not found


hsoub ~> MYVAR1= "2"
wiki ~> MYVAR1= "2"
bash: 2: command not found
bash: 2: command not found


hsoub ~> unset MYVAR1 first_name full_name
wiki ~> unset MYVAR1 first_name full_name


hsoub ~> echo $MYVAR1 $first_name $full_name
wiki ~> echo $MYVAR1 $first_name $full_name
<--no output-->
<--no output-->


hsoub ~>
wiki ~>
</syntaxhighlight>تصدير المتغيّرات
</syntaxhighlight>


== تصدير المتغيّرات ==
المتغير الذي يُنشأ مثلما رأينا في المثال أعلاه لا يكون متاحًا إلا في الصدفة الحالية، فهو متغير محلّي، والعمليات الفرعية للصدفة الحالية لن تتعرف على هذا المتغير.
المتغير الذي يُنشأ مثلما رأينا في المثال أعلاه لا يكون متاحًا إلا في الصدفة الحالية، فهو متغير محلّي، والعمليات الفرعية للصدفة الحالية لن تتعرف على هذا المتغير.


ولكي تمرِّر المتغيرات إلى الصدفة الفرعية يجب أن نصدّرها باستخدام أمر export أولًا، ويشار إلى المتغيرات التي صُدِّرَت على أنها متغيراتُ بيئة، وتتم عمليتي الضبط والتصدير في خطوة واحدة:<syntaxhighlight lang="bash">
ولكي تمرِّر المتغيرات إلى الصدفة الفرعية يجب أن نصدّرها باستخدام أمر <code>export</code> أولًا، ويشار إلى المتغيرات التي صُدِّرَت على أنها متغيراتُ بيئة، وتتم عمليتي الضبط والتصدير في خطوة واحدة:<syntaxhighlight lang="bash">
export VARNAME="value"
export VARNAME="value"
</syntaxhighlight>ويمكن للصدفة الفرعية أن تعدّل على المتغيرات التي اكتسبتها من الصدفة الأم، لكن تلك التغييرات لن تؤثر في الصدفة الأم، إليك مثالًا يشرح الأمر:<syntaxhighlight lang="bash" start="1">
</syntaxhighlight>ويمكن للصدفة الفرعية أن تعدّل على المتغيرات التي اكتسبتها من الصدفة الأم، لكن تلك التغييرات لن تؤثر في الصدفة الأم، إليك مثالًا يشرح الأمر:<syntaxhighlight lang="bash" start="1">
hsoub ~> full_name="Hsoub Alaraby"
wiki ~> full_name="Wiki Hsoub"


hsoub ~> bash
wiki ~> bash


hsoub ~> echo $full_name
wiki ~> echo $full_name




hsoub ~> exit
wiki ~> exit


hsoub ~> export full_name
wiki ~> export full_name


hsoub ~> bash
wiki ~> bash


hsoub ~> echo $full_name
wiki ~> echo $full_name
Hsoub Alaraby
Wiki Hsoub


hsoub ~> export full_name="Osama H. Damarany"
wiki ~> export full_name="Osama H. Damarany"


hsoub ~> echo $full_name
wiki ~> echo $full_name
Osama H. Damarany
Osama H. Damarany


hsoub ~> exit
wiki ~> exit


hsoub ~> echo $full_name
wiki ~> echo $full_name
Hsoub Alaraby
Wiki Hsoub


hsoub ~>
wiki ~>
</syntaxhighlight><span>في المثال أعلاه، لدينا المتغير full_name له قيمة هي Hsoub Alaraby، وحين نحاول قراءة تلك القيمة في صدفة فرعية فإننا نحصل على إجابة فارغة (يظهر أمر echo قيمة فارغة -null string-).</span>
</syntaxhighlight><span>في المثال أعلاه، لدينا المتغير <code>full_name</code> له قيمة هي <code>Wiki Hsoub</code>، وحين نحاول قراءة تلك القيمة في صدفة فرعية فإننا نحصل على إجابة فارغة (يُظهر أمر <code>echo</code> قيمة فارغة -null string-).</span>


نخرج الآن من الصدفة الفرعية ونصدّر متغير full_name ونحن في الصدفة الأم، ثم نفتح صدفة فرعية جديدة ونطلب قيمة المتغير full_name مرة أخرى، فنحصل هذه المرة على قيمته (Hsoub Alaraby)، ذلك أن المتغير صار مرئيًا للصدفة الفرعية بعد تصديره.
نخرج الآن من الصدفة الفرعية ونصدّر متغير <code>full_name</code> ونحن في الصدفة الأم، ثم نفتح صدفة فرعية جديدة ونطلب قيمة المتغير <code>full_name</code> مرة أخرى، فنحصل هذه المرة على قيمته (<span><code>Wiki Hsoub</code></span>)، ذلك أن المتغير صار مرئيًا للصدفة الفرعية بعد تصديره.


نستطيع تغيير قيمة المتغير داخل الصدفة الفرعية كما ترى في المثال إلى (Osama H. Damarany)، لكن حين نخرج من تلك الصدفة ونعود إلى الصدفة الأم لنطلب قيمة المتغير نفسه، فإننا نحصل على القيمة الأولى (Hsoub Alaraby)، فلم تتأثر قيمته في الصدفة الأم بتغيرها داخل صدفة فرعية.
نستطيع تغيير قيمة المتغير داخل الصدفة الفرعية كما ترى في المثال إلى (<code>Osama H. Damarany</code>)، لكن حين نخرج من تلك الصدفة ونعود إلى الصدفة الأم لنطلب قيمة المتغير نفسه، فإننا نحصل على القيمة الأولى (<span><code>Wiki Hsoub</code></span>)، فلم تتأثر قيمته في الصدفة الأم بتغيرها داخل صدفة فرعية.


المتغيرات المحفوظة
== المتغيرات المحفوظة ==


المتغيرات المحفوظة في صدفة بورن
=== المتغيرات المحفوظة في صدفة بورن ===
تستخدم Bash بعض المتغيرات بنفس الطريقة التي تستخدمها صدفة بورن بها، وتعطي Bash في بعض الحالات قيمة افتراضية للمتغير، يعطي الجدول التالي نظرة عامة على تلك المتغيرات:


تستخدم Bash بعض المتغيرات بنفس الطريقة التي تستخدمها صدفة بورن بها، وتعطي bash في بعض الحالات قيمة افتراضية للمتغير، يعطي الجدول التالي نظرة عامة على تلك المتغيرات:
'''جدول 3.1 : المتغيرات المحفوظة في صدفة بورن'''
 
جدول 3.1 : المتغيرات المحفوظة في صدفة بورن
{| class="wikitable"
{| class="wikitable"
|'''اسم المتغير'''
|'''اسم المتغير'''
|'''التعريف'''
|'''التعريف'''
|-
|-
|CDPATH
|<code>CDPATH</code>
|قائمة من المجلدات يفصل بين كل منها نقطتان ":" تُستخدم كمسار للبحث لأمر cd.
|قائمة من المجلدات يفصل بين كل منها نقطتان ":" تُستخدم كمسار للبحث لأمر <code>cd</code>.
|-
|-
|HOME
|<code>HOME</code>
|مجلد المنزل للمستخدم الحالي، وهو المجلد الافتراضي لأمر cd. يستخدم تَوسُّع المَدّة (tilde expansion) قيمة هذا المتغير أيضًا.
|مجلد المنزل للمستخدم الحالي، وهو المجلد الافتراضي لأمر <code>cd</code>. يستخدم تَوسُّع المَدّة (tilde expansion) قيمة هذا المتغير أيضًا.
|-
|-
|IFS
|<code>IFS</code>
|قائمة من المحارف التي تفصل بين الحقول، تُستخدم حين تفصل الصدفة الكلمات كجزء من عملية التوسع.
|قائمة من المحارف التي تفصل بين الحقول، تُستخدم حين تفصل الصدفة الكلمات كجزء من عملية التوسع.
|-
|-
|<code>MAIL</code>
|<code>MAIL</code>
|عند تعيين أحد الملفات كقيمة لهذا المعامل فإن bash تُشعر المستخدم بوصول بريد في ذلك الملف، بشرط ألا يُضبط متغير MAILPATH على أي قيمة.
|عند تعيين أحد الملفات كقيمة لهذا المعامل فإن Bash تُشعر المستخدم بوصول بريد في ذلك الملف، بشرط ألا يُضبط متغير <code>MAILPATH</code> على أي قيمة.
|-
|-
|<code>MAILPATH</code>
|<code>MAILPATH</code>
|قائمة بأسماء الملفات تفصل بينها نقطتان رأسيتان. تتفقد bash تلك القائمة دوريًا لترى إن كانت هناك رسائل بريدية جديدة.
|قائمة بأسماء الملفات تفصل بينها نقطتان رأسيتان. تتفقد Bash تلك القائمة دوريًا لترى إن كانت هناك رسائل بريدية جديدة.
|-
|-
|<code>OPTARG</code>
|<code>OPTARG</code>
|قيمة آخر وسيط خياري (option argument) عالجه أمر getopts.
|قيمة آخر وسيط خياري (option argument) عالجه أمر <code>getopts</code>.
|-
|-
|<code>OPTIND</code>
|<code>OPTIND</code>
|فهرس (index) لآخر وسيط خياري (option argument) عالجه أمر getopts.
|فهرس (index) لآخر وسيط خياري (option argument) عالجه أمر <code>getopts</code>.
|-
|-
|<code>PATH</code>
|<code>PATH</code>
|قائمة من المجلدات التي يفصل بين كل منها نقطتان رأسيتان ":" تبحث فيها bash عن الأوامر.
|قائمة من المجلدات التي يفصل بين كل منها نقطتان رأسيتان ":" تبحث فيها Bash عن الأوامر.
|-
|-
|<code>PS1</code>
|<code>PS1</code>
سطر 256: سطر 247:
|<code>PS2</code>
|<code>PS2</code>
|النص الثانوي للمحث، وقيمته الافتراضية هي <code>"" <""</code> .
|النص الثانوي للمحث، وقيمته الافتراضية هي <code>"" <""</code> .
|}المتغيرات المحفوظة في صدفة Bash
|}


=== المتغيرات المحفوظة في صدفة Bash ===
تُضبط هذه المتغيرات أو تُستخدم من قِبل Bash، أما بقية الصدفات فلا تعاملها بشكل خاص عما سواها:
تُضبط هذه المتغيرات أو تُستخدم من قِبل Bash، أما بقية الصدفات فلا تعاملها بشكل خاص عما سواها:


جدول 3.2 : المتغيرات المحفوظة في صدفة Bash<span> </span>
'''جدول 3.2 : المتغيرات المحفوظة في صدفة Bash'''<span> </span>
{| class="wikitable"
{| class="wikitable"
|اسم المتغير
|اسم المتغير
|التعريف
|التعريف
|-
|-
|auto_resume
|<code>auto_resume</code>
|يتحكم هذا المتغير في كيفية تفاعل الصدفة مع المستخدم والتحكم في الوظائف (Job Control).
|يتحكم هذا المتغير في كيفية تفاعل الصدفة مع المستخدم والتحكم في الوظائف (Job Control).
|-
|-
|BASH
|<code>BASH</code>
|الاسم الكامل للمسار المُستخدَم في تنفيذ النسخة الحالية من Bash
|الاسم الكامل للمسار المُستخدَم في تنفيذ النسخة الحالية من Bash
|-
|-
|BASH_ENV
|<code>BASH_ENV</code>
|إن ضُبط هذا المتغير عند استدعاء bash من أجل تنفيذ برنامج للصدفة (shell script) فإن قيمته تتوسع ويُستخدم كاسم لملف بدء تشغيل (startup file) يُقرأ قبل تنفيذ البرنامج.
|إن ضُبط هذا المتغير عند استدعاء Bash من أجل تنفيذ برنامج للصدفة (shell script) فإن قيمته تتوسع ويُستخدم كاسم لملف بدء تشغيل (startup file) يُقرأ قبل تنفيذ البرنامج.
|-
|-
|BASH_VERSION
|<code>BASH_VERSION</code>
|رقم الإصدار للنسخة الحالية من Bash.
|رقم الإصدار للنسخة الحالية من Bash.
|-
|-
|BASH_VERSINFO
|<code>BASH_VERSINFO</code>
|متغير مصفوفة للقراءة فقط، تحمل عناصره معلومات عن إصدارة النسخة الحالية من Bash.
|متغير مصفوفة للقراءة فقط، تحمل عناصره معلومات عن إصدارة النسخة الحالية من Bash.
|-
|-
|COLUMNS
|<code>COLUMNS</code>
|يستخدم أمر select هذا المتغير لتحديد عرض الطرفية عند طباعة قوائم الاختيار، ويُضبط تلقائيًا عند تلقي إشارة SIGWINCH .
|يستخدم أمر <code>select</code> هذا المتغير لتحديد عرض الطرفية عند طباعة قوائم الاختيار، ويُضبط تلقائيًا عند تلقي إشارة <code>SIGWINCH</code> .
|-
|-
|COMP_CWORD
|<code>COMP_CWORD</code>
|فهرس إلى {COMP_WORDS}$ من الكلمة التي تحتوي الموضع الحالي للمؤشر.
|فهرس إلى <code>{COMP_WORDS}$</code> من الكلمة التي تحتوي الموضع الحالي للمؤشر.
|-
|-
|COMP_LINE
|<code>COMP_LINE</code>
|سطر الأوامر الحالي.
|سطر الأوامر الحالي.
|-
|-
|COMP_POINT
|<code>COMP_POINT</code>
|فهرس للموضع الحالي للمؤشر بالنسبة لبداية الأمر الحالي.
|فهرس للموضع الحالي للمؤشر بالنسبة لبداية الأمر الحالي.
|-
|-
|COMP_WORDS
|<code>COMP_WORDS</code>
|متغير مصفوفة يتكون من كلمات منفردة في سطر الأوامر الحالي.
|متغير مصفوفة يتكون من كلمات منفردة في سطر الأوامر الحالي.
|-
|-
|COMPREPLY
|<code>COMPREPLY</code>
|متغير مصفوفة تقرأ منه Bash الاحتمالات الممكنة للإكمال، والمولَّدة عبر دالة مستدعاة من قِبل أداة إكمال قابلة للبرمجة (programmable).
|متغير مصفوفة تقرأ منه Bash الاحتمالات الممكنة للإكمال، والمولَّدة عبر دالة مستدعاة من قِبل أداة إكمال قابلة للبرمجة (programmable).
|-
|-
|DIRSTACK
|<code>DIRSTACK</code>
|متغير مصفوفة به المحتويات الحالية لمكدّس المجلدات.
|متغير مصفوفة به المحتويات الحالية لمكدّس المجلدات.
|-
|-
|EUID
|<code>EUID</code>
|المعرّف الرقمي الفعّال للمستخدم الحالي.
|المعرّف الرقمي الفعّال للمستخدم الحالي.
|-
|-
|FCEDIT
|<code>FCEDIT</code>
|المحرر المستخدم افتراضيًا من قِبل خيار e- لأمر fc.
|المحرر المستخدم افتراضيًا من قِبل خيار <code>e-</code> لأمر <code>fc</code>.
|-
|-
|FIGNORE
|<code>FIGNORE</code>
|قائمة لواحق (suffixes) يفصل بين كل منها نقطتان رأسيتان، يتم تجاهلها عند إكمال اسم ملف ما.
|قائمة لواحق (suffixes) يفصل بين كل منها نقطتان رأسيتان، يتم تجاهلها عند إكمال اسم ملف ما.
|-
|-
|FUNCNAME
|<code>FUNCNAME</code>
|اسم أي دالة للصدفة تُنفّذ حاليًا.
|اسم أي دالة للصدفة تُنفّذ حاليًا.
|-
|-
|GLOBIGNORE
|<code>GLOBIGNORE</code>
|قائمة من الأنماط التي تحدد مجموعة أسماء الملفات التي يتم تجاهلها من قِبل توسُّع اسم الملف (file name expansion).
|قائمة من الأنماط التي تحدد مجموعة أسماء الملفات التي يتم تجاهلها من قِبل توسُّع اسم الملف (file name expansion).
|-
|-
|GROUPS
|<code>GROUPS</code>
|متغير مصفوفة يحتوي قائمة من المجموعات التي ينتمي إليها المستخدم الحالي.
|متغير مصفوفة يحتوي قائمة من المجموعات التي ينتمي إليها المستخدم الحالي.
|-
|-
|histchars
|<code>histchars</code>
|مجموعة محارف (بحد أقصى 3) تتحكم في توسع التأريخ، والاستبدال السريع والترميز (tokenization).
|مجموعة محارف (بحد أقصى 3) تتحكم في توسع التأريخ، والاستبدال السريع والترميز (tokenization).
|-
|-
|HISTCMD
|<code>HISTCMD</code>
|رقم التأريخ أو فهرس في قائمة التأريخ للأمر الحالي.
|رقم التأريخ أو فهرس في قائمة التأريخ للأمر الحالي.
|-
|-
|HISTCONTROL
|<code>HISTCONTROL</code>
|يحدد ما إن كان أمر ما قد أضيف إلى ملف التأريخ.
|يحدد ما إن كان أمر ما قد أضيف إلى ملف التأريخ.
|-
|-
|HISTFILE
|<code>HISTFILE</code>
|اسم الملف الذي يُحفظ فيه تأريخ الأوامر، تكون قيمته bash_history./~ افتراضيًا.
|اسم الملف الذي يُحفظ فيه تأريخ الأوامر، تكون قيمته <code>bash_history./~</code> افتراضيًا.
|-
|-
|HISTFILESIZE
|<code>HISTFILESIZE</code>
|أقصى عدد من الأسطر التي يمكن استيعابها في ملف تأريخ، يُضبط افتراضيًا على 500.
|أقصى عدد من الأسطر التي يمكن استيعابها في ملف تأريخ، يُضبط افتراضيًا على 500.
|-
|-
|HISTIGNORE
|<code>HISTIGNORE</code>
|قائمة من الأنماط المستخدمة في تحديد أسطر الأوامر التي يجب أن تُحفظ في قائمة التأريخ.
|قائمة من الأنماط المستخدمة في تحديد أسطر الأوامر التي يجب أن تُحفظ في قائمة التأريخ.
|-
|-
|HISTSIZE
|<code>HISTSIZE</code>
|أقصى عدد من الأوامر التي يمكن حفظها في قائمة التأريخ، الحد الافتراضي هو 500.
|أقصى عدد من الأوامر التي يمكن حفظها في قائمة التأريخ، الحد الافتراضي هو 500.
|-
|-
|HOSTFILE
|<code>HOSTFILE</code>
|يحتوي اسم ملف بنفس صيغة etc/hosts/ الذي يجب أن يُقرأ عندما تحتاج الصدفة أن تكمل اسم المضيف (hostname).
|يحتوي اسم ملف بنفس صيغة <code>etc/hosts/</code> الذي يجب أن يُقرأ عندما تحتاج الصدفة أن تكمل اسم المضيف (hostname).
|-
|-
|HOSTNAME
|<code>HOSTNAME</code>
|اسم المُضيف الحالي.
|اسم المُضيف الحالي.
|-
|-
|HOSTTYPE
|<code>HOSTTYPE</code>
|نص يصف الحاسوب/الآلة التي تعمل Bash عليها.
|نص يصف الحاسوب/الآلة التي تعمل Bash عليها.
|-
|-
|IGNOREEOF
|<code>IGNOREEOF</code>
|يتحكم هذا المتغير في الإجراء الذي تتخذه الصدفة عند استلام محرف EOF كمُدخَل وحيد.
|يتحكم هذا المتغير في الإجراء الذي تتخذه الصدفة عند استلام محرف EOF كمُدخَل وحيد.
|-
|-
|INPUTRC
|<code>INPUTRC</code>
|اسم ملف تهيئة Readline، يحل هذا محل etc/inputrc/ الافتراضي.
|اسم ملف تهيئة <code>Readline</code>، يحل هذا محل <code>etc/inputrc/</code> الافتراضي.
|-
|-
|LANG
|<code>LANG</code>
|يُستخدم لتحديد التصنيف الموضعي لأي تصنيف لم يتم اختياره تحديدًا بمتغير يبدأ بـ _LC .
|يُستخدم لتحديد التصنيف الموضعي لأي تصنيف لم يتم اختياره تحديدًا بمتغير يبدأ بـ <code>_LC</code> .
|-
|-
|LC_ALL
|<code>LC_ALL</code>
|يلغي هذا المتغير قيمة LANG وأي متغير _LC آخر يحدد تصنيفًا موضعيًا.
|يلغي هذا المتغير قيمة <code>LANG</code> وأي متغير <code>_LC</code> آخر يحدد تصنيفًا موضعيًا.
|-
|-
|LC_COLLATE
|<code>LC_COLLATE</code>
|يحدد هذا المتغير ترتيب المقارنة (collation order) المستخدم أثناء تصنيف نتائج توسعة اسم الملف (file name expansion)، ويحدد سلوك تعبيرات المدى (range expressions) وطبقات المعادلة (equivalence classes) وتسلسلات المقارنات (collating sequences) داخل توسعة اسم الملف، وكذلك ومطابقة الأنماط (pattern matching).
|يحدد هذا المتغير ترتيب المقارنة (collation order) المستخدم أثناء تصنيف نتائج توسعة اسم الملف (file name expansion)، ويحدد سلوك تعبيرات المدى (range expressions) وطبقات المعادلة (equivalence classes) وتسلسلات المقارنات (collating sequences) داخل توسعة اسم الملف، وكذلك ومطابقة الأنماط (pattern matching).
|-
|-
|LC_CTYPE
|<code>LC_CTYPE</code>
|يحدد هذا المتغير تفسير المحارف وسلوك طبقات المحارف داخل توسعة اسم الملف ومطابقة الأنماط.
|يحدد هذا المتغير تفسير المحارف وسلوك طبقات المحارف داخل توسعة اسم الملف ومطابقة الأنماط.
|-
|-
|LC_MESSAGES
|<code>LC_MESSAGES</code>
|يحدد هذا المتغير الموضع المستخدم لترجمة النصوص التي بين علامتي تنصيص مزدوجة، والتي سُبقت بعلامة "$".
|يحدد هذا المتغير الموضع المستخدم لترجمة النصوص التي بين علامتي تنصيص مزدوجة، والتي سُبقت بعلامة "<code>$</code>".
|-
|-
|LC_NUMERIC
|<code>LC_NUMERIC</code>
|يحدد هذا المتغير موضع التصنيف المستخدم لتهيئة الرقم (number formatting).
|يحدد هذا المتغير موضع التصنيف المستخدم لتهيئة الرقم (number formatting).
|-
|-
|LINENO
|<code>LINENO</code>
|رقم السطر الذي يُنفَّذ الآن في برنامج الصدفة (shell script) أو دالة الصدفة.
|رقم السطر الذي يُنفَّذ الآن في برنامج الصدفة (shell script) أو دالة الصدفة.
|-
|-
|LINES
|<code>LINES</code>
|يستخدم هذا المتغير بواسطة أمر select لتحديد طول العمود لطباعة قوائم الاختيار.
|يستخدم هذا المتغير بواسطة أمر <code>select</code> لتحديد طول العمود لطباعة قوائم الاختيار.
|-
|-
|MACHTYPE
|<code>MACHTYPE</code>
|نص يصف نوع النظام الذي تنفذه Bash، بصيغة GNU CPU-COMPANY-SYSTEM.
|نص يصف نوع النظام الذي تنفذه Bash، بصيغة GNU CPU-COMPANY-SYSTEM.
|-
|-
|MAILCHECK
|<code>MAILCHECK</code>
|الزمن -بالثواني- الذي يمضي حتى تتفقد الصدفة البريد داخل الملفات المحددة في متغيرات MAIL و MAILPATH.
|الزمن -بالثواني- الذي يمضي حتى تتفقد الصدفة البريد داخل الملفات المحددة في متغيرات <code>MAIL</code> و <code>MAILPATH</code>.
|-
|-
|OLDPWD
|<code>OLDPWD</code>
|المجلد العامل السابق الذي حدده أمر cd.
|المجلد العامل السابق الذي حدده أمر <code>cd</code>.
|-
|-
|OPTERR
|<code>OPTERR</code>
|إن ضُبطت قيمة هذا المتغير على 1 فإن Bashتعرض رسائل خطأ مولّدة بواسطة أمر getopts.
|إن ضُبطت قيمة هذا المتغير على <code>1</code> فإن Bash تعرض رسائل خطأ مولّدة بواسطة أمر <code>getopts</code>.
|-
|-
|OSTYPE
|<code>OSTYPE</code>
|نص يصف نظام التشغيل العاملة عليه Bash.
|نص يصف نظام التشغيل العاملة عليه Bash.
|-
|-
|PIPESTATUS
|<code>PIPESTATUS</code>
|متغير مصفوفة يحتوي قائمة بها قِيَم حالات الخروج من العمليات التي في أنبوب الواجهة (foreground pipeline) الذي نُفِّذ حديثًا (قد يحتوي أمرًا واحدًا فقط).
|متغير مصفوفة يحتوي قائمة بها قِيَم حالات الخروج من العمليات التي في أنبوب الواجهة (foreground pipeline) الذي نُفِّذ حديثًا (قد يحتوي أمرًا واحدًا فقط).
|-
|-
|POSIXLY_CORRECT
|<code>POSIXLY_CORRECT</code>
|إن كان هذا المتغير موجودًا في البيئة حين تبدأ Bash فإن الصدفة تدخل وضع POSIX.
|إن كان هذا المتغير موجودًا في البيئة حين تبدأ Bash فإن الصدفة تدخل وضع POSIX.
|-
|-
|PPID
|<code>PPID</code>
|معرّف العملية التي تكون الصدفة عملية فرعية لها، أي معرّف العملية الأم للصدفة.
|معرّف العملية التي تكون الصدفة عملية فرعية لها، أي معرّف العملية الأم للصدفة.
|-
|-
|PROMPT_COMMAND
|<code>PROMPT_COMMAND</code>
|عند ضبط هذا المتغير فإن القيمة تُفسر على أنها أمر يجب تنفيذه قبل طباعة كل محث رئيسي (PS1).
|عند ضبط هذا المتغير فإن القيمة تُفسر على أنها أمر يجب تنفيذه قبل طباعة كل محث رئيسي (PS1).
|-
|-
|PS3
|<code>PS3</code>
|تُستخدم قيمة هذا المتغير كمحث لأمر select، القيمة الافتراضية له هي "' ?#'".
|تُستخدم قيمة هذا المتغير كمحث لأمر select، القيمة الافتراضية له هي <code>"' ?#'"</code>.
|-
|-
|PS4
|<code>PS4</code>
|قيمة هذا المتغير هي المحث المطبوع قبل طباعة سطر الأوامر باستخدام أمر echo عند تحديد خيار x-. القيمة الافتراضية هي "' +'".
|قيمة هذا المتغير هي المحث المطبوع قبل طباعة سطر الأوامر باستخدام أمر <code>echo</code> عند تحديد خيار <code>x-</code>. القيمة الافتراضية هي <code>"' +'"</code>.
|-
|-
|PWD
|<code>PWD</code>
|مجلد العامل الحالي كما حدده أمر cd.
|مجلد العمل الحالي كما حدده أمر <code>cd</code>.
|-
|-
|RANDOM
|<code>RANDOM</code>
|في كل مرة يُشار فيها إلى هذا المعامل فإن رقمًا عشوائيًا بين 0 و 32767 يتم توليده. وتعيين قيمة لهذا المتغير يغذي عملية التوليد العشوائي تلك.
|في كل مرة يُشار فيها إلى هذا المعامل فإن رقمًا عشوائيًا بين 0 و 32767 يتم توليده. وتعيين قيمة لهذا المتغير يغذي عملية التوليد العشوائي تلك.
|-
|-
|REPLY
|<code>REPLY</code>
|المتغير الافتراضي لأمر read
|المتغير الافتراضي لأمر <code>read</code>
|-
|-
|SECONDS
|<code>SECONDS</code>
|يتوسع هذا المتغير إلى عدد الثواني التي مرت منذ بدء الصدفة.
|يتوسع هذا المتغير إلى عدد الثواني التي مرت منذ بدء الصدفة.
|-
|-
|SHELLOPTS
|<code>SHELLOPTS</code>
|قائمة بخيارات الصدفة المفعّلة، يفصل بين كل منها نقطتان رأسيتان.
|قائمة بخيارات الصدفة المفعّلة، يفصل بين كل منها نقطتان رأسيتان.
|-
|-
|SHLVL
|<code>SHLVL</code>
|تزيد قيمة هذا المتغير بمقدار 1 في كل مرة تُفتح صدفة bash جديدة.
|تزيد قيمة هذا المتغير بمقدار <code>1</code> في كل مرة تُفتح صدفة Bash جديدة.
|-
|-
|TIMEFORMAT
|<code>TIMEFORMAT</code>
|تُستخدم قيمة هذا المتغير كنص تهيئة يحدد كيفية عرض معلومات التوقيت للأنابيب (pipelines) المُسبوقة بكلمة time.
|تُستخدم قيمة هذا المتغير كنص تهيئة يحدد كيفية عرض معلومات التوقيت للأنابيب (pipelines) المُسبوقة بكلمة <code>time</code>.
|-
|-
|TMOUT
|<code>TMOUT</code>
|عند ضبط هذا المتغير بقيمة أكبر من الصفر فإن TMOUT تُعامَل على أنها الوقت المنقضي لأمر read. وتُفسر القيمة في صدفة تفاعلية على أنها عدد الثواني التي يجب انتظار مُدخَل (input) فيها قبل إصدار المحث الرئيسي حين تكون الصدفة تفاعلية، وتغلق bash بعد تلك الثواني إن لم يأت المُدخل.
|عند ضبط هذا المتغير بقيمة أكبر من الصفر فإن <code>TMOUT</code> تُعامَل على أنها الوقت المنقضي لأمر <code>read</code>. وتُفسر القيمة في صدفة تفاعلية على أنها عدد الثواني التي يجب انتظار مُدخَل (input) فيها قبل إصدار المحث الرئيسي حين تكون الصدفة تفاعلية، وتغلق Bash بعد تلك الثواني إن لم يأت المُدخل.
|-
|-
|UID
|<code>UID</code>
|المعرّف الرقمي والحقيقي للمستخدم الحالي.
|المعرّف الرقمي والحقيقي للمستخدم الحالي.
|}تفقَّد صفحات man أو info في Bash لمعلومات أكثر تفصيلًا، قد تكون بعض المتغيرات للقراءة فقط وبعضها مضبوط تلقائيًا وبعضها الآخر يفقد وظيفته إن ضُبط على قيمة غير قيمته الافتراضية.
|}تفقَّد صفحات <code>man</code> أو <code>info</code> في Bash لمعلومات أكثر تفصيلًا، قد تكون بعض المتغيرات للقراءة فقط وبعضها مضبوط تلقائيًا وبعضها الآخر يفقد وظيفته إن ضُبط على قيمة غير قيمته الافتراضية.
 
المعامِلات الخاصة


== المعامِلات الخاصة ==
تتعامل الصدفة مع بعض المعامِلات بطريقة خاصة، إذ يُسمح فقط أن يُشار إلى تلك المعامِلات (referenced) ولا يُسمح بتعيين قيَم لها.
تتعامل الصدفة مع بعض المعامِلات بطريقة خاصة، إذ يُسمح فقط أن يُشار إلى تلك المعامِلات (referenced) ولا يُسمح بتعيين قيَم لها.


جدول 3.3 : المتغيرات الخاصة في Bash
'''جدول 3.3 : المتغيرات الخاصة في Bash'''
{| class="wikitable"
{| class="wikitable"
|المحرف
|المحرف
سطر 450: سطر 441:
|-
|-
|<code>*$</code>
|<code>*$</code>
|يتوسع إلى المعامِلات الموضعية بدءًا من وحين يحدث التوسع بين علامات تنصيص مزدوجة فإنه يتوسع إلى كلمة واحدة، ويفصل أول محرف من متغير IFS الخاص بين قيم المعامِلات.
|يتوسع إلى المعامِلات الموضعية بدءًا من <code>1</code>، وحين يحدث التوسع بين علامات تنصيص مزدوجة فإنه يتوسع إلى كلمة واحدة، ويفصل أول محرف من متغير <code>IFS</code> الخاص بين قيم المعامِلات.
|-
|-
|<code>@$</code>
|<code>@$</code>
|يتوسع إلى المعامِلات الموضعية بدءًا من وحين يحدث التوسع بين علامات تنصيص مزدوجة فإن كل معامِل يتوسع إلى كلمة مستقلة.
|يتوسع إلى المعامِلات الموضعية بدءًا من <code>1</code>، وحين يحدث التوسع بين علامات تنصيص مزدوجة فإن كل معامِل يتوسع إلى كلمة مستقلة.
|-
|-
|<code>#$</code>
|<code>#$</code>
سطر 475: سطر 466:
|<code>_$</code>
|<code>_$</code>
|تُحدد قيمة متغير الشَّرطة السفلية عند بدء الصدفة، ويحمل الاسم المطلق للصدفة أو لبرنامج الصدفة الذي يُنفَّذ كما مُرِّر له في قائمة الوسائط (arguments).
|تُحدد قيمة متغير الشَّرطة السفلية عند بدء الصدفة، ويحمل الاسم المطلق للصدفة أو لبرنامج الصدفة الذي يُنفَّذ كما مُرِّر له في قائمة الوسائط (arguments).
ثم يتوسع بعد ذلك إلى آخر وسيط للأمر السابق بعد عملية التوسعة، ويُضبط أيضًا على الاسم الكامل لمسار كل أمر تم تنفيذه ووضعه في البيئة المُصدَّرة لذلك الأمر. وعند تفقّد البريد فإن هذا المعامل يحمل اسم ملف البريد.
ثم يتوسع بعد ذلك إلى آخر وسيط للأمر السابق بعد عملية التوسعة، ويُضبط أيضًا على الاسم الكامل لمسار كل أمر تم تنفيذه ووضعه في البيئة المُصدَّرة لذلك الأمر. وعند تفقّد البريد فإن هذا المعامل يحمل اسم ملف البريد.
|}
|}
الفرق بين *$ و @$
<blockquote>'''الفرق بين <code>*$</code> و <code>@$</code>'''</blockquote><blockquote>قد يتسبب استخدام <code>*$</code> في حدوث عثرات أو ثغرات أمنية في برامجك، وتقريبًا في كل مرة يستخدم مبرمج فيها <code>*$</code> فإنه يقصد <code>@$</code>.</blockquote>المعامِلات الموضعية هي الكلمات التي تتبع اسم برنامج الصدفة، وتوضع تلك المعامِلات في المتغيرات <code>1$</code> و <code>2$</code> و <code>3$</code> وهكذا، وتضاف المتغيرات إلى مصفوفة داخلية طالما دعت الحاجة إلى ذلك، ويحمل <code>#$</code> العدد الإجمالي للمعاملِات كما ترى في البرنامج البسيط التالي:<syntaxhighlight lang="bash">
 
قد يتسبب استخدام *$ في حدوث عثرات أو ثغرات أمنية في برامجك، وتقريبًا في كل مرة يستخدم مبرمج فيها *$ فإنه يقصد @$.
 
المعامِلات الموضعية هي الكلمات التي تتبع اسم برنامج الصدفة، وتوضع تلك المعامِلات في المتغيرات 1$ و 2$ و 3$ وهكذا، وتضاف المتغيرات إلى مصفوفة داخلية طالما دعت الحاجة إلى ذلك، ويحمل #$ العدد الإجمالي للمعاملِات كما ترى في البرنامج البسيط التالي:<syntaxhighlight lang="bash">
#!/bin/bash
#!/bin/bash


سطر 498: سطر 484:
echo "The total number of positional parameters is $#."
echo "The total number of positional parameters is $#."
</syntaxhighlight>وبعد التنفيذ يمكنك أن تضيف أي عدد من الوسائط:<syntaxhighlight lang="bash">
</syntaxhighlight>وبعد التنفيذ يمكنك أن تضيف أي عدد من الوسائط:<syntaxhighlight lang="bash">
hsoub ~> positional.sh one two three four five
wiki ~> positional.sh one two three four five
one is the first positional parameter, $1.
one is the first positional parameter, $1.
two is the second positional parameter, $2.
two is the second positional parameter, $2.
سطر 505: سطر 491:
The total number of positional parameters is 5.
The total number of positional parameters is 5.


hsoub ~> positional.sh one two
wiki ~> positional.sh one two
one is the first positional parameter, $1.
one is the first positional parameter, $1.
two is the second positional parameter, $2.
two is the second positional parameter, $2.
سطر 511: سطر 497:


The total number of positional parameters is 2.
The total number of positional parameters is 2.
</syntaxhighlight><span> </span>
</syntaxhighlight>انظر تقييم تلك المعامِلات في [[Bash/conditional statements|البُنى الشرطية في Bash]]، و<nowiki/>[[Bash/the shift built-in|استخدام الأمر المُضمَّن Shift في Bash]]. إليك بعض الأمثلة على المعامِلات الخاصة الأخرى:<syntaxhighlight lang="bash">
wiki ~> grep dictionary /usr/share/dict/words
dictionary
 
wiki ~> echo $_
/usr/share/dict/words
 
wiki ~> echo $$
10662
 
wiki ~> mozilla &
[1] 11064
 
wiki ~> echo $!
11064
 
wiki ~> echo $0
bash
 
wiki ~> echo $?
0
 
wiki ~> ls doesnotexist
ls: doesnotexist: No such file or directory
 
wiki ~> echo $?
1
 
wiki ~>
</syntaxhighlight>يبدأ المستخدم <code>wiki</code> في المثال السابق بإدخال أمر <code>grep</code> الذي ينتج عنه تعيين قيمة للمتغير <code>_</code>، ويكون معرّف العملية لصدفته <code>10662</code>، وبعد وضع العملية في الخلفية فإن <code>!</code> تحتفظ بمعرّف العملية التي في الخلفية، والصدفة العاملة هنا هي Bash، وحين يحدث خطأ فإن <code>?</code> تحتفظ برمز خروج مختلف عن <code>0</code> (صفر).
 
== إعادة تدوير برامج الصدفة باستخدام المتغيرات ==
تساعدك المتغيرات على تطبيق برامج الصدفة (shell scripts) في بيئات أخرى أو لأغراض أخرى، هذا غير أنها تجعل البرنامج أسهل في القراءة، انظر المثال التالي لبرنامج بسيط يأخذ نسخة احتياطية من مجلد المنزل الخاص بالمستخدم <code>wiki</code> في خادم عن بعد:<syntaxhighlight lang="bash">
#!/bin/bash
 
# ينسخ هذا البرنامج مجلد المنزل الخاص بي
 
cd /home
 
# َهذا الأمرُ ينشئ الأرشيف
tar cf /var/tmp/home_wiki.tar wiki > /dev/null 2>&1
 
# احذف ملف bzip2 القديم
# ثم أعد توجيه الأخطاء لأن هذا ينتج بعض الأخطاء إن كان الأرشيف غير موجود، ثم أنشئ بعد ذلك ملفًا مضغوطًا جديدًا.
rm /var/tmp/home_wiki.tar.bz2 2> /dev/null
bzip2 /var/tmp/home_wiki.tar
 
# انسخ الملف إلى مضيف آخر - لدينا مفاتيح ssh لإتمام ذلك دون تدخل.
scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1
 
# أنشئ ختمًا بالزمن في ملف السجل.
date >> /home/wiki/log/home_backup.log
echo backup succeeded >> /home/wiki/log/home_backup.log
</syntaxhighlight>أولًا ستقع في أخطاء إن سمَّيْت الملفات والمجلدات يدويًا في كل مرة تحتاج ذلك. وثانيًا، افترض أن <code>wiki</code> يريد أن يعطي ذلك البرنامج إلى <code>osama</code>، إذًا سيحتاج <code>osama</code> إلى إجراء بعض التعديلات قبل أن يستطيع استخدامه لإنشاء نسخة احتياطية من مجلد المنزل الخاص به. وتستطيع قول مثل ذلك إن أراد <code>wiki</code> استخدام ذلك البرنامج لأخذ نسخ احتياطية لمجلدات أخرى.
 
<span> </span>ولتسهيل عملية إعادة التدوير، اجعل كل الملفات والمجلات وأسماء المستخدمين وأسماء الخوادم وغير ذلك متغيرة، فهكذا لا تحتاج إلا تعديل القيمة مرة واحدة دون الحاجة لفحص البرنامج كله لمعرفة مكان معامل ما، إليك مثالًا على ذلك:<syntaxhighlight lang="bash">
#!/bin/bash
                                                                                               
# ينشئ هذا البرنامج نسخة احتياطية من مجلد المنزل الخاص بي.
 
# غير قيم المتغيرات كي يعمل البرنامج لديك:
BACKUPDIR=/home
BACKUPFILES=wiki
TARFILE=/var/tmp/home_wiki.tar
BZIPFILE=/var/tmp/home_wiki.tar.bz2
SERVER=bordeaux
REMOTEDIR=/opt/backup/wiki
LOGFILE=/home/wiki/log/home_backup.log
 
cd $BACKUPDIR
 
# هذا ينشئ الأرشيف
tar cf $TARFILE $BACKUPFILES > /dev/null 2>&1
                                                                                               
# احذف ملف bzip2 القديم
# ثم أعد توجيه الأخطاء لأن هذا ينتج بعض الأخطاء إن كان الأرشيف غير موجود، ثم أنشئ بعد ذلك ملفًا مضغوطًا جديدًا.
rm $BZIPFILE 2> /dev/null
bzip2 $TARFILE
 
# انسخ الملف إلى مضيف آخر - لدينا مفاتيح ssh لإتمام ذلك دون تدخل.
 
scp $BZIPFILE $SERVER:$REMOTEDIR > /dev/null 2>&1
 
# Create a timestamp in a logfile.
date >> $LOGFILE
echo backup succeeded >> $LOGFILE
</syntaxhighlight><blockquote>'''المجلدات الكبيرة وسرعة الانترنت سعة المنخفضة'''</blockquote><blockquote>يمكن لأي كان أن يستوعب المثال أعلاه حيث استخدمنا مجلدًا صغيرًا ومضيفًا على نفس الشبكة الفرعية (subnet)، لكن سرعة تنفيذ تلك العملية تعتمد على حجم المجلد لديك وسرعة الانترنت وموقع الخادم، فقد تستغرق أوقاتًا طويلة لإنشاء نسخ احتياطية باستخدام هذا الأسلوب.</blockquote><blockquote>والحل الذي يصلح في حالة المجلدات الكبيرة هو استخدام <code>rsync</code> لإبقاء المجلدات في كلا الناحيتين متزامنة.</blockquote>
 
== انظر أيضًا ==
* [[Bash/examples using grep|أمثلة عن استخدام grep]].
* [[Bash/repetitive tasks|المهام التكرارية في Bash]].


انظر تقييم تلك المعامِلات في [[Bash/conditional statements|البُنى الشرطية في Bash]]، و
== مصادر ==
* [http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_02.html دليل Bash للمبتدئين، صفحة المتغيرات في Bash].
[[تصنيف:Bash]]
[[تصنيف:Bash Variables]]
[[تصنيف:Bash Exporting Variables]]
[[تصنيف:Bash Special Parameters]]

المراجعة الحالية بتاريخ 08:08، 21 أكتوبر 2022

أنواع المتغيرات

تُكتب متغيرات الصدفة بحروف إنجليزية كبيرة، وتحتفظ Bash بقائمة من نوعين من المتغيرات:

المتغيرات العامة Global Variables

ستجد المتغيرات العامة أو متغيرات البيئة (environment variables) في جميع الصدفات، ويمكن استخدام أوامر env أو printenv لعرض متغيرات البيئة، وتأتي تلك البرامج في حزمة sh-utils. إليك مثالًا لخرج أمر printenv:

wiki ~> printenv
CC=gcc
CDPATH=.:~:/usr/local:/usr:/
CFLAGS=-O2 -fomit-frame-pointer
COLORTERM=gnome-terminal
CXXFLAGS=-O2 -fomit-frame-pointer
DISPLAY=:0
DOMAIN=hq.garrels.be
e=
TOR=vi
FCEDIT=vi
FIGNORE=.o:~
G_BROKEN_FILENAMES=1
GDK_USE_XFT=1
GDMSESSION=Default
GNOME_DESKTOP_SESSION_ID=Default
GTK_RC_FILES=/etc/gtk/gtkrc:/nethome/wiki/.gtkrc-1.2-gnome2
GWMCOLOR=darkgreen
GWMTERM=xterm
HISTFILESIZE=5000
history_control=ignoredups
HISTSIZE=2000
HOME=/nethome/wiki
HOSTNAME=hsoub.hq.garrels.be
INPUTRC=/etc/inputrc
IRCNAME=wiki
JAVA_HOME=/usr/java/j2sdk1.4.0
LANG=en_US
LDFLAGS=-s
LD_LIBRARY_PATH=/usr/lib/mozilla:/usr/lib/mozilla/plugins
LESSCHARSET=latin1
LESS=-edfMQ
LESSOPEN=|/usr/bin/lesspipe.sh %s
LEX=flex
LOCAL_MACHINE=hsoub
LOGNAME=wiki
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;35:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
MACHINES=hsoub
MAILCHECK=60
MAIL=/var/mail/wiki
MANPATH=/usr/man:/usr/share/man/:/usr/local/man:/usr/X11R6/man
MEAN_MACHINES=hsoub
MOZ_DIST_BIN=/usr/lib/mozilla
MOZILLA_FIVE_HOME=/usr/lib/mozilla
MOZ_PROGRAM=/usr/lib/mozilla/mozilla-bin
MTOOLS_FAT_COMPATIBILITY=1
MYMALLOC=0
NNTPPORT=119
NNTPSERVER=news
NPX_PLUGIN_PATH=/plugin/ns4plugin/:/usr/lib/netscape/plugins
OLDPWD=/nethome/wiki
OS=Linux
PAGER=less
PATH=/nethome/wiki/bin.Linux:/nethome/wiki/bin:/usr/local/bin:/usr/local/sbin:/usr/X11R6/bin:/usr/bin:/usr/sbin:/bin:/sbin:.
PS1=\[\033[1;44m\]wiki is in \w\[\033[0m\]
PS2=More input>
PWD=/nethome/wiki
SESSION_MANAGER=local/hsoub.hq.garrels.be:/tmp/.ICE-unix/22106
SHELL=/bin/bash
SHELL_LOGIN=--login
SHLVL=2
SSH_AGENT_PID=22161
SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpass
SSH_AUTH_SOCK=/tmp/ssh-XXmhQ4fC/agent.22106
START_WM=twm
TERM=xterm
TYPE=type
USERNAME=wiki
USER=wiki
_=/usr/bin/printenv
VISUAL=vi
WINDOWID=20971661
XAPPLRESDIR=/nethome/wiki/app-defaults
XAUTHORITY=/nethome/wiki/.Xauthority
XENVIRONMENT=/nethome/wiki/.Xdefaults
XFILESEARCHPATH=/usr/X11R6/lib/X11/%L/%T/%N%C%S:/usr/X11R6/lib/X11/%l/%T/%N%C%S:/usr/X11R6/lib/X11/%T/%N%C%S:/usr/X11R6/lib/X11/%L/%T/%N%S:/usr/X11R6/lib/X11/%l/%T/%N%S:/usr/X11R6/lib/X11/%T/%N%S
XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB
XMODIFIERS=@im=none
XTERMID=
XWINHOME=/usr/X11R6
X=X11R6
YACC=bison -y

المتغيرات المحلية Local Variables

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

وإليك مثالًا لملف diff أُنشئ من مقارنة خَرجيْ الأمرين printenv و set ، بعد استثناء الدوال التي يمكن عرضها باستخدام أمر set أيضًا:

wiki ~> diff set.sorted printenv.sorted | grep "<" | awk '{ print $2 }'
BASE=/nethome/wiki/.Shell/hq.garrels.be/hsoub.aliases
BASH=/bin/bash
BASH_VERSINFO=([0]="2"
BASH_VERSION='2.05b.0(1)-release'
COLUMNS=80
DIRSTACK=()
DO_FORTUNE=
EUID=504
GROUPS=()
HERE=/home/wiki
HISTFILE=/nethome/wiki/.bash_history
HOSTTYPE=i686
IFS=$'
LINES=24
MACHTYPE=i686-pc-linux-gnu
OPTERR=1
OPTIND=1
OSTYPE=linux-gnu
PIPESTATUS=([0]="0")
PPID=10099
PS4='+
PWD_REAL='pwd
SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
THERE=/home/wiki
UID=504

للمزيد عن لغة Awk البرمجية المُستخدمة في المثال السابق، انظر صفحتها على ويكيبيديا.

تصنيف المتغيرات بناء على محتواها

يمكن تصنيف المتغيرات وفقًا لنوع المحتوى الذي يحمله المتغير، وبناءً على ذلك فإن المتغيرات تنقسم إلى أربعة أنواع:

  • متغيرات نصية.
  • متغيرات عددية.
  • متغيرات ثابتة.
  • متغيرات المصفوفة.

ستجد مزيدًا من الشرح عن هذه الأنواع في المزيد عن المتغيرات في Bash، أما الآن فسنعمل مع قيم عددية ونصية للمتغيرات التي لدينا.

إنشاء المتغيرات

أسماء المتغيرات حساسة لحالة الأحرف، ويُكتب المتغير بأحرف إنجليزية كبيرة افتراضيًا لكن يمكن إعطاء المتغيرات المحلية أسماء بأحرف صغيرة، وفي كل الأحوال فإن لديك الحرية في استخدام الأسماء التي تريدها أو أن تضع حروفًا صغيرة وكبيرة داخل اسم متغير واحد. كذلك فإن المتغيرات يمكن أن تحتوي أرقامًا بشرط ألا يبدأ اسم المتغير برقم:

prompt> export 1number=1
bash: export: `1number=1': not a valid identifier

استخدم الشيفرة التالية لضبط قيمة متغير في الصدفة:

VARNAME="value"

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

wiki ~> MYVAR1="2"

wiki ~> echo $MYVAR1
2

wiki ~> first_name="Wiki"

wiki ~> echo $first_name
Wiki

wiki ~> full_name="Wiki Hsoub"

wiki ~> echo $full_name
Wiki Hsoub

wiki ~> MYVAR-2="2"
bash: MYVAR-2=2: command not found

wiki ~> MYVAR1 ="2"
bash: MYVAR1: command not found

wiki ~> MYVAR1= "2"
bash: 2: command not found

wiki ~> unset MYVAR1 first_name full_name

wiki ~> echo $MYVAR1 $first_name $full_name
<--no output-->

wiki ~>

تصدير المتغيّرات

المتغير الذي يُنشأ مثلما رأينا في المثال أعلاه لا يكون متاحًا إلا في الصدفة الحالية، فهو متغير محلّي، والعمليات الفرعية للصدفة الحالية لن تتعرف على هذا المتغير.

ولكي تمرِّر المتغيرات إلى الصدفة الفرعية يجب أن نصدّرها باستخدام أمر export أولًا، ويشار إلى المتغيرات التي صُدِّرَت على أنها متغيراتُ بيئة، وتتم عمليتي الضبط والتصدير في خطوة واحدة:

export VARNAME="value"

ويمكن للصدفة الفرعية أن تعدّل على المتغيرات التي اكتسبتها من الصدفة الأم، لكن تلك التغييرات لن تؤثر في الصدفة الأم، إليك مثالًا يشرح الأمر:

wiki ~> full_name="Wiki Hsoub"

wiki ~> bash

wiki ~> echo $full_name


wiki ~> exit

wiki ~> export full_name

wiki ~> bash

wiki ~> echo $full_name
Wiki Hsoub

wiki ~> export full_name="Osama H. Damarany"

wiki ~> echo $full_name
Osama H. Damarany

wiki ~> exit

wiki ~> echo $full_name
Wiki Hsoub

wiki ~>

في المثال أعلاه، لدينا المتغير full_name له قيمة هي Wiki Hsoub، وحين نحاول قراءة تلك القيمة في صدفة فرعية فإننا نحصل على إجابة فارغة (يُظهر أمر echo قيمة فارغة -null string-).

نخرج الآن من الصدفة الفرعية ونصدّر متغير full_name ونحن في الصدفة الأم، ثم نفتح صدفة فرعية جديدة ونطلب قيمة المتغير full_name مرة أخرى، فنحصل هذه المرة على قيمته (Wiki Hsoub)، ذلك أن المتغير صار مرئيًا للصدفة الفرعية بعد تصديره.

نستطيع تغيير قيمة المتغير داخل الصدفة الفرعية كما ترى في المثال إلى (Osama H. Damarany)، لكن حين نخرج من تلك الصدفة ونعود إلى الصدفة الأم لنطلب قيمة المتغير نفسه، فإننا نحصل على القيمة الأولى (Wiki Hsoub)، فلم تتأثر قيمته في الصدفة الأم بتغيرها داخل صدفة فرعية.

المتغيرات المحفوظة

المتغيرات المحفوظة في صدفة بورن

تستخدم Bash بعض المتغيرات بنفس الطريقة التي تستخدمها صدفة بورن بها، وتعطي Bash في بعض الحالات قيمة افتراضية للمتغير، يعطي الجدول التالي نظرة عامة على تلك المتغيرات:

جدول 3.1 : المتغيرات المحفوظة في صدفة بورن

اسم المتغير التعريف
CDPATH قائمة من المجلدات يفصل بين كل منها نقطتان ":" تُستخدم كمسار للبحث لأمر cd.
HOME مجلد المنزل للمستخدم الحالي، وهو المجلد الافتراضي لأمر cd. يستخدم تَوسُّع المَدّة (tilde expansion) قيمة هذا المتغير أيضًا.
IFS قائمة من المحارف التي تفصل بين الحقول، تُستخدم حين تفصل الصدفة الكلمات كجزء من عملية التوسع.
MAIL عند تعيين أحد الملفات كقيمة لهذا المعامل فإن Bash تُشعر المستخدم بوصول بريد في ذلك الملف، بشرط ألا يُضبط متغير MAILPATH على أي قيمة.
MAILPATH قائمة بأسماء الملفات تفصل بينها نقطتان رأسيتان. تتفقد Bash تلك القائمة دوريًا لترى إن كانت هناك رسائل بريدية جديدة.
OPTARG قيمة آخر وسيط خياري (option argument) عالجه أمر getopts.
OPTIND فهرس (index) لآخر وسيط خياري (option argument) عالجه أمر getopts.
PATH قائمة من المجلدات التي يفصل بين كل منها نقطتان رأسيتان ":" تبحث فيها Bash عن الأوامر.
PS1 النص الأساسي للمحث، وقيمته الافتراضية هي "' $\s-\v\'" .
PS2 النص الثانوي للمحث، وقيمته الافتراضية هي "" <"" .

المتغيرات المحفوظة في صدفة Bash

تُضبط هذه المتغيرات أو تُستخدم من قِبل Bash، أما بقية الصدفات فلا تعاملها بشكل خاص عما سواها:

جدول 3.2 : المتغيرات المحفوظة في صدفة Bash

اسم المتغير التعريف
auto_resume يتحكم هذا المتغير في كيفية تفاعل الصدفة مع المستخدم والتحكم في الوظائف (Job Control).
BASH الاسم الكامل للمسار المُستخدَم في تنفيذ النسخة الحالية من Bash
BASH_ENV إن ضُبط هذا المتغير عند استدعاء Bash من أجل تنفيذ برنامج للصدفة (shell script) فإن قيمته تتوسع ويُستخدم كاسم لملف بدء تشغيل (startup file) يُقرأ قبل تنفيذ البرنامج.
BASH_VERSION رقم الإصدار للنسخة الحالية من Bash.
BASH_VERSINFO متغير مصفوفة للقراءة فقط، تحمل عناصره معلومات عن إصدارة النسخة الحالية من Bash.
COLUMNS يستخدم أمر select هذا المتغير لتحديد عرض الطرفية عند طباعة قوائم الاختيار، ويُضبط تلقائيًا عند تلقي إشارة SIGWINCH .
COMP_CWORD فهرس إلى {COMP_WORDS}$ من الكلمة التي تحتوي الموضع الحالي للمؤشر.
COMP_LINE سطر الأوامر الحالي.
COMP_POINT فهرس للموضع الحالي للمؤشر بالنسبة لبداية الأمر الحالي.
COMP_WORDS متغير مصفوفة يتكون من كلمات منفردة في سطر الأوامر الحالي.
COMPREPLY متغير مصفوفة تقرأ منه Bash الاحتمالات الممكنة للإكمال، والمولَّدة عبر دالة مستدعاة من قِبل أداة إكمال قابلة للبرمجة (programmable).
DIRSTACK متغير مصفوفة به المحتويات الحالية لمكدّس المجلدات.
EUID المعرّف الرقمي الفعّال للمستخدم الحالي.
FCEDIT المحرر المستخدم افتراضيًا من قِبل خيار e- لأمر fc.
FIGNORE قائمة لواحق (suffixes) يفصل بين كل منها نقطتان رأسيتان، يتم تجاهلها عند إكمال اسم ملف ما.
FUNCNAME اسم أي دالة للصدفة تُنفّذ حاليًا.
GLOBIGNORE قائمة من الأنماط التي تحدد مجموعة أسماء الملفات التي يتم تجاهلها من قِبل توسُّع اسم الملف (file name expansion).
GROUPS متغير مصفوفة يحتوي قائمة من المجموعات التي ينتمي إليها المستخدم الحالي.
histchars مجموعة محارف (بحد أقصى 3) تتحكم في توسع التأريخ، والاستبدال السريع والترميز (tokenization).
HISTCMD رقم التأريخ أو فهرس في قائمة التأريخ للأمر الحالي.
HISTCONTROL يحدد ما إن كان أمر ما قد أضيف إلى ملف التأريخ.
HISTFILE اسم الملف الذي يُحفظ فيه تأريخ الأوامر، تكون قيمته bash_history./~ افتراضيًا.
HISTFILESIZE أقصى عدد من الأسطر التي يمكن استيعابها في ملف تأريخ، يُضبط افتراضيًا على 500.
HISTIGNORE قائمة من الأنماط المستخدمة في تحديد أسطر الأوامر التي يجب أن تُحفظ في قائمة التأريخ.
HISTSIZE أقصى عدد من الأوامر التي يمكن حفظها في قائمة التأريخ، الحد الافتراضي هو 500.
HOSTFILE يحتوي اسم ملف بنفس صيغة etc/hosts/ الذي يجب أن يُقرأ عندما تحتاج الصدفة أن تكمل اسم المضيف (hostname).
HOSTNAME اسم المُضيف الحالي.
HOSTTYPE نص يصف الحاسوب/الآلة التي تعمل Bash عليها.
IGNOREEOF يتحكم هذا المتغير في الإجراء الذي تتخذه الصدفة عند استلام محرف EOF كمُدخَل وحيد.
INPUTRC اسم ملف تهيئة Readline، يحل هذا محل etc/inputrc/ الافتراضي.
LANG يُستخدم لتحديد التصنيف الموضعي لأي تصنيف لم يتم اختياره تحديدًا بمتغير يبدأ بـ _LC .
LC_ALL يلغي هذا المتغير قيمة LANG وأي متغير _LC آخر يحدد تصنيفًا موضعيًا.
LC_COLLATE يحدد هذا المتغير ترتيب المقارنة (collation order) المستخدم أثناء تصنيف نتائج توسعة اسم الملف (file name expansion)، ويحدد سلوك تعبيرات المدى (range expressions) وطبقات المعادلة (equivalence classes) وتسلسلات المقارنات (collating sequences) داخل توسعة اسم الملف، وكذلك ومطابقة الأنماط (pattern matching).
LC_CTYPE يحدد هذا المتغير تفسير المحارف وسلوك طبقات المحارف داخل توسعة اسم الملف ومطابقة الأنماط.
LC_MESSAGES يحدد هذا المتغير الموضع المستخدم لترجمة النصوص التي بين علامتي تنصيص مزدوجة، والتي سُبقت بعلامة "$".
LC_NUMERIC يحدد هذا المتغير موضع التصنيف المستخدم لتهيئة الرقم (number formatting).
LINENO رقم السطر الذي يُنفَّذ الآن في برنامج الصدفة (shell script) أو دالة الصدفة.
LINES يستخدم هذا المتغير بواسطة أمر select لتحديد طول العمود لطباعة قوائم الاختيار.
MACHTYPE نص يصف نوع النظام الذي تنفذه Bash، بصيغة GNU CPU-COMPANY-SYSTEM.
MAILCHECK الزمن -بالثواني- الذي يمضي حتى تتفقد الصدفة البريد داخل الملفات المحددة في متغيرات MAIL و MAILPATH.
OLDPWD المجلد العامل السابق الذي حدده أمر cd.
OPTERR إن ضُبطت قيمة هذا المتغير على 1 فإن Bash تعرض رسائل خطأ مولّدة بواسطة أمر getopts.
OSTYPE نص يصف نظام التشغيل العاملة عليه Bash.
PIPESTATUS متغير مصفوفة يحتوي قائمة بها قِيَم حالات الخروج من العمليات التي في أنبوب الواجهة (foreground pipeline) الذي نُفِّذ حديثًا (قد يحتوي أمرًا واحدًا فقط).
POSIXLY_CORRECT إن كان هذا المتغير موجودًا في البيئة حين تبدأ Bash فإن الصدفة تدخل وضع POSIX.
PPID معرّف العملية التي تكون الصدفة عملية فرعية لها، أي معرّف العملية الأم للصدفة.
PROMPT_COMMAND عند ضبط هذا المتغير فإن القيمة تُفسر على أنها أمر يجب تنفيذه قبل طباعة كل محث رئيسي (PS1).
PS3 تُستخدم قيمة هذا المتغير كمحث لأمر select، القيمة الافتراضية له هي "' ?#'".
PS4 قيمة هذا المتغير هي المحث المطبوع قبل طباعة سطر الأوامر باستخدام أمر echo عند تحديد خيار x-. القيمة الافتراضية هي "' +'".
PWD مجلد العمل الحالي كما حدده أمر cd.
RANDOM في كل مرة يُشار فيها إلى هذا المعامل فإن رقمًا عشوائيًا بين 0 و 32767 يتم توليده. وتعيين قيمة لهذا المتغير يغذي عملية التوليد العشوائي تلك.
REPLY المتغير الافتراضي لأمر read
SECONDS يتوسع هذا المتغير إلى عدد الثواني التي مرت منذ بدء الصدفة.
SHELLOPTS قائمة بخيارات الصدفة المفعّلة، يفصل بين كل منها نقطتان رأسيتان.
SHLVL تزيد قيمة هذا المتغير بمقدار 1 في كل مرة تُفتح صدفة Bash جديدة.
TIMEFORMAT تُستخدم قيمة هذا المتغير كنص تهيئة يحدد كيفية عرض معلومات التوقيت للأنابيب (pipelines) المُسبوقة بكلمة time.
TMOUT عند ضبط هذا المتغير بقيمة أكبر من الصفر فإن TMOUT تُعامَل على أنها الوقت المنقضي لأمر read. وتُفسر القيمة في صدفة تفاعلية على أنها عدد الثواني التي يجب انتظار مُدخَل (input) فيها قبل إصدار المحث الرئيسي حين تكون الصدفة تفاعلية، وتغلق Bash بعد تلك الثواني إن لم يأت المُدخل.
UID المعرّف الرقمي والحقيقي للمستخدم الحالي.

تفقَّد صفحات man أو info في Bash لمعلومات أكثر تفصيلًا، قد تكون بعض المتغيرات للقراءة فقط وبعضها مضبوط تلقائيًا وبعضها الآخر يفقد وظيفته إن ضُبط على قيمة غير قيمته الافتراضية.

المعامِلات الخاصة

تتعامل الصدفة مع بعض المعامِلات بطريقة خاصة، إذ يُسمح فقط أن يُشار إلى تلك المعامِلات (referenced) ولا يُسمح بتعيين قيَم لها.

جدول 3.3 : المتغيرات الخاصة في Bash

المحرف التعريف
*$ يتوسع إلى المعامِلات الموضعية بدءًا من 1، وحين يحدث التوسع بين علامات تنصيص مزدوجة فإنه يتوسع إلى كلمة واحدة، ويفصل أول محرف من متغير IFS الخاص بين قيم المعامِلات.
@$ يتوسع إلى المعامِلات الموضعية بدءًا من 1، وحين يحدث التوسع بين علامات تنصيص مزدوجة فإن كل معامِل يتوسع إلى كلمة مستقلة.
#$ يتوسع إلى عدد المعامِلات الموضعية.
?$ يتوسع إلى حالة الخروج لآخر أنبوب واجهة (foreground pipeline) تم تنفيذه.
-$ تتوسع الشَّرطَة إلى رايات الخيارات (option flags) الحالية كما حُددت عند الاستدعاء بواسطة أمر set ، أو إلى رايات الخيارات التي حددتها الصدفة نفسها.
$$ يتوسع إلى معرِّف عملية الصدفة.
!$ يتوسع إلى معرف آخر أمر نُفِّذ في الخلفية بشكل غير متزامن (asynchronous).
0$ يتوسع إلى اسم الصدفة أو اسم برنامج الصدفة (shell script).
_$ تُحدد قيمة متغير الشَّرطة السفلية عند بدء الصدفة، ويحمل الاسم المطلق للصدفة أو لبرنامج الصدفة الذي يُنفَّذ كما مُرِّر له في قائمة الوسائط (arguments).

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

الفرق بين *$ و @$

قد يتسبب استخدام *$ في حدوث عثرات أو ثغرات أمنية في برامجك، وتقريبًا في كل مرة يستخدم مبرمج فيها *$ فإنه يقصد @$.

المعامِلات الموضعية هي الكلمات التي تتبع اسم برنامج الصدفة، وتوضع تلك المعامِلات في المتغيرات 1$ و 2$ و 3$ وهكذا، وتضاف المتغيرات إلى مصفوفة داخلية طالما دعت الحاجة إلى ذلك، ويحمل #$ العدد الإجمالي للمعاملِات كما ترى في البرنامج البسيط التالي:

#!/bin/bash

# positional.sh
# This script reads 3 positional parameters and prints them out.

POSPAR1="$1"
POSPAR2="$2"
POSPAR3="$3"

echo "$1 is the first positional parameter, \$1."
echo "$2 is the second positional parameter, \$2."
echo "$3 is the third positional parameter, \$3."
echo
echo "The total number of positional parameters is $#."

وبعد التنفيذ يمكنك أن تضيف أي عدد من الوسائط:

wiki ~> positional.sh one two three four five
one is the first positional parameter, $1.
two is the second positional parameter, $2.
three is the third positional parameter, $3.

The total number of positional parameters is 5.

wiki ~> positional.sh one two
one is the first positional parameter, $1.
two is the second positional parameter, $2.
 is the third positional parameter, $3.

The total number of positional parameters is 2.

انظر تقييم تلك المعامِلات في البُنى الشرطية في Bash، واستخدام الأمر المُضمَّن Shift في Bash. إليك بعض الأمثلة على المعامِلات الخاصة الأخرى:

wiki ~> grep dictionary /usr/share/dict/words
dictionary

wiki ~> echo $_
/usr/share/dict/words

wiki ~> echo $$
10662

wiki ~> mozilla &
[1] 11064

wiki ~> echo $!
11064

wiki ~> echo $0
bash

wiki ~> echo $?
0

wiki ~> ls doesnotexist
ls: doesnotexist: No such file or directory

wiki ~> echo $?
1

wiki ~>

يبدأ المستخدم wiki في المثال السابق بإدخال أمر grep الذي ينتج عنه تعيين قيمة للمتغير _، ويكون معرّف العملية لصدفته 10662، وبعد وضع العملية في الخلفية فإن ! تحتفظ بمعرّف العملية التي في الخلفية، والصدفة العاملة هنا هي Bash، وحين يحدث خطأ فإن ? تحتفظ برمز خروج مختلف عن 0 (صفر).

إعادة تدوير برامج الصدفة باستخدام المتغيرات

تساعدك المتغيرات على تطبيق برامج الصدفة (shell scripts) في بيئات أخرى أو لأغراض أخرى، هذا غير أنها تجعل البرنامج أسهل في القراءة، انظر المثال التالي لبرنامج بسيط يأخذ نسخة احتياطية من مجلد المنزل الخاص بالمستخدم wiki في خادم عن بعد:

#!/bin/bash

# ينسخ هذا البرنامج مجلد المنزل الخاص بي

cd /home

# َهذا الأمرُ ينشئ الأرشيف
tar cf /var/tmp/home_wiki.tar wiki > /dev/null 2>&1

# احذف ملف bzip2 القديم
# ثم أعد توجيه الأخطاء لأن هذا ينتج بعض الأخطاء إن كان الأرشيف غير موجود، ثم أنشئ بعد ذلك ملفًا مضغوطًا جديدًا.
rm /var/tmp/home_wiki.tar.bz2 2> /dev/null
bzip2 /var/tmp/home_wiki.tar

# انسخ الملف إلى مضيف آخر - لدينا مفاتيح ssh لإتمام ذلك دون تدخل.
scp /var/tmp/home_franky.tar.bz2 bordeaux:/opt/backup/franky > /dev/null 2>&1

# أنشئ ختمًا بالزمن في ملف السجل.
date >> /home/wiki/log/home_backup.log
echo backup succeeded >> /home/wiki/log/home_backup.log

أولًا ستقع في أخطاء إن سمَّيْت الملفات والمجلدات يدويًا في كل مرة تحتاج ذلك. وثانيًا، افترض أن wiki يريد أن يعطي ذلك البرنامج إلى osama، إذًا سيحتاج osama إلى إجراء بعض التعديلات قبل أن يستطيع استخدامه لإنشاء نسخة احتياطية من مجلد المنزل الخاص به. وتستطيع قول مثل ذلك إن أراد wiki استخدام ذلك البرنامج لأخذ نسخ احتياطية لمجلدات أخرى. ولتسهيل عملية إعادة التدوير، اجعل كل الملفات والمجلات وأسماء المستخدمين وأسماء الخوادم وغير ذلك متغيرة، فهكذا لا تحتاج إلا تعديل القيمة مرة واحدة دون الحاجة لفحص البرنامج كله لمعرفة مكان معامل ما، إليك مثالًا على ذلك:

#!/bin/bash
                                                                                                 
# ينشئ هذا البرنامج نسخة احتياطية من مجلد المنزل الخاص بي.

# غير قيم المتغيرات كي يعمل البرنامج لديك:
BACKUPDIR=/home
BACKUPFILES=wiki
TARFILE=/var/tmp/home_wiki.tar
BZIPFILE=/var/tmp/home_wiki.tar.bz2
SERVER=bordeaux
REMOTEDIR=/opt/backup/wiki
LOGFILE=/home/wiki/log/home_backup.log

cd $BACKUPDIR

# هذا ينشئ الأرشيف
tar cf $TARFILE $BACKUPFILES > /dev/null 2>&1
                                                                                                 
# احذف ملف bzip2 القديم
# ثم أعد توجيه الأخطاء لأن هذا ينتج بعض الأخطاء إن كان الأرشيف غير موجود، ثم أنشئ بعد ذلك ملفًا مضغوطًا جديدًا.
rm $BZIPFILE 2> /dev/null
bzip2 $TARFILE

# انسخ الملف إلى مضيف آخر - لدينا مفاتيح ssh لإتمام ذلك دون تدخل.

scp $BZIPFILE $SERVER:$REMOTEDIR > /dev/null 2>&1

# Create a timestamp in a logfile.
date >> $LOGFILE
echo backup succeeded >> $LOGFILE

المجلدات الكبيرة وسرعة الانترنت سعة المنخفضة

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

والحل الذي يصلح في حالة المجلدات الكبيرة هو استخدام rsync لإبقاء المجلدات في كلا الناحيتين متزامنة.

انظر أيضًا

مصادر