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

من موسوعة حسوب
إضافة 1.0: عنوان الصفحة
 
إضافة 2.0: إدخال أولي
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:المتغيرات في Bash}}</noinclude>
<noinclude>{{DISPLAYTITLE:المتغيرات في Bash}}</noinclude>
أنواع المتغيرات
تُكتب متغيرات الصدفة بحروف إنجليزية كبيرة، وتحتفظ Bash بقائمة من نوعين من المتغيرات:
المتغيرات العامة Global Variables
ستجد المتغيرات العامة أو متغيرات البيئة (environment variables) في جميع الصدفات، ويمكن استخدام أوامر env أو printenv لعرض متغيرات البيئة، وتأتي تلك البرامج في حزمة sh-utils. إليك مثالًا لخرج أمر printenv:<syntaxhighlight lang="bash">
hsoub ~> 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/hsoub/.gtkrc-1.2-gnome2
GWMCOLOR=darkgreen
GWMTERM=xterm
HISTFILESIZE=5000
history_control=ignoredups
HISTSIZE=2000
HOME=/nethome/hsoub
HOSTNAME=octarine.hq.garrels.be
INPUTRC=/etc/inputrc
IRCNAME=hsoub
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=octarine
LOGNAME=hsoub
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
MAILCHECK=60
MAIL=/var/mail/hsoub
MANPATH=/usr/man:/usr/share/man/:/usr/local/man:/usr/X11R6/man
MEAN_MACHINES=octarine
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/hsoub
OS=Linux
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:.
PS1=\[\033[1;44m\]hsoub is in \w\[\033[0m\]
PS2=More input>
PWD=/nethome/hsoub
SESSION_MANAGER=local/octarine.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=hsoub
USER=hsoub
_=/usr/bin/printenv
VISUAL=vi
WINDOWID=20971661
XAPPLRESDIR=/nethome/hsoub/app-defaults
XAUTHORITY=/nethome/hsoub/.Xauthority
XENVIRONMENT=/nethome/hsoub/.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
</syntaxhighlight>المتغيرات المحلية Local Variables
لن تجد المتغيرات المحلية إلا في الصدفة الحالية، ويمكن استخدام أمر set -بدون خيارات- لعرض قائمة بكل الدوال والمتغيرات -بما في ذلك متغيرات البيئة-، ويُصنَّف الخَرْج وفقًا للموضع الحالي ويُعرض كذلك في صيغة يمكن إعادة استخدامها.
وإليك مثالًا لملف diff أُنشئ من مقارنة خَرجيْ الأمرين printenv و set ، بعد استثناء الدوال التي يمكن عرضها باستخدام أمر set أيضًا:<syntaxhighlight lang="bash">
hsoub ~> diff set.sorted printenv.sorted | grep "<" | awk '{ print $2 }'
BASE=/nethome/hsoub/.Shell/hq.garrels.be/octarine.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/hsoub
HISTFILE=/nethome/hsoub/.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/hsoub
UID=504
</syntaxhighlight>للمزيد عن لغة Awk البرمجية المُستخدمة في المثال السابق، انظر صفحتها على [https://ar.wikipedia.org/wiki/%D8%A3%D9%88%D9%83 ويكيبيديا].
=== تصنيف المتغيرات بناء على محتواها ===
يمكن تصنيف المتغيرات وفقًا لنوع المحتوى الذي يحمله المتغير، وبناءً على ذلك فإن المتغيرات تنقسم إلى أربعة أنواع:
متغيرات نصية.
متغيرات عددية.
متغيرات ثابتة.
متغيرات المصفوفة.
ستجد مزيدًا من الشرح عن هذه الأنواع في [[Bash/more on variables|المزيد عن المتغيرات في Bash]]، أما الآن فسنعمل مع قيم عددية ونصية للمتغيرات التي لدينا.
إنشاء المتغيرات
أسماء المتغيرات حساسة لحالة الأحرف، ويُكتب المتغير بأحرف إنجليزية كبيرة افتراضيًا لكن يمكن إعطاء المتغيرات المحلية أسماء بأحرف صغيرة، وفي كل الأحوال فإن لديك الحرية في استخدام الأسماء التي تريدها أو أن تضع حروفًا صغيرة وكبيرة داخل اسم متغير واحد.
كذلك فإن المتغيرات يمكن أن تحتوي أرقامًا بشرط ألا يبدأ اسم المتغير برقم:<syntaxhighlight lang="bash">
prompt> export 1number=1
bash: export: `1number=1': not a valid identifier
</syntaxhighlight>استخدم الشيفرة التالية لضبط قيمة متغير في الصدفة:<syntaxhighlight lang="bash">
VARNAME="value"
</syntaxhighlight>لكن انتبه، فلا تضع مسافات حول علامتي التنصيص إذ سيتسبب ذلك في أخطاء، لذا من الجيد أن تكتسب عادة اقتباس المحتوى النصي حين تعيّن قِيَمًا لمتغيرات، إذ سيقلل هذا احتمال وقوع الخطأ. إليك بعض الأمثلة على استخدام الأحرف بحالتيها والأرقام والمسافات:<syntaxhighlight lang="bash">
hsoub ~> MYVAR1="2"
hsoub ~> echo $MYVAR1
2
hsoub ~> first_name="Hsoub"
hsoub ~> echo $first_name
Hsoub
hsoub ~> full_name="Hsoub Alaraby"
hsoub ~> echo $full_name
Hsoub Alaraby
hsoub ~> MYVAR-2="2"
bash: MYVAR-2=2: command not found
hsoub ~> MYVAR1 ="2"
bash: MYVAR1: command not found
hsoub ~> MYVAR1= "2"
bash: 2: command not found
hsoub ~> unset MYVAR1 first_name full_name
hsoub ~> echo $MYVAR1 $first_name $full_name
<--no output-->
hsoub ~>
</syntaxhighlight>تصدير المتغيّرات
المتغير الذي يُنشأ مثلما رأينا في المثال أعلاه لا يكون متاحًا إلا في الصدفة الحالية، فهو متغير محلّي، والعمليات الفرعية للصدفة الحالية لن تتعرف على هذا المتغير.
ولكي تمرِّر المتغيرات إلى الصدفة الفرعية يجب أن نصدّرها باستخدام أمر export أولًا، ويشار إلى المتغيرات التي صُدِّرَت على أنها متغيراتُ بيئة، وتتم عمليتي الضبط والتصدير في خطوة واحدة:<syntaxhighlight lang="bash">
export VARNAME="value"
</syntaxhighlight>ويمكن للصدفة الفرعية أن تعدّل على المتغيرات التي اكتسبتها من الصدفة الأم، لكن تلك التغييرات لن تؤثر في الصدفة الأم، إليك مثالًا يشرح الأمر:<syntaxhighlight lang="bash">
hsoub ~> full_name="Hsoub Alaraby"
hsoub ~> bash
hsoub ~> echo $full_name
hsoub ~> exit
hsoub ~> export full_name
hsoub ~> bash
hsoub ~> echo $full_name
Hsoub Alaraby
hsoub ~> export full_name="Charles the Great"
hsoub ~> echo $full_name
Charles the Great
hsoub ~> exit
hsoub ~> echo $full_name
Hsoub Alaraby
hsoub ~>
</syntaxhighlight><span> </span>

مراجعة 20:24، 4 أغسطس 2018

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

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

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

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

hsoub ~> 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/hsoub/.gtkrc-1.2-gnome2
GWMCOLOR=darkgreen
GWMTERM=xterm
HISTFILESIZE=5000
history_control=ignoredups
HISTSIZE=2000
HOME=/nethome/hsoub
HOSTNAME=octarine.hq.garrels.be
INPUTRC=/etc/inputrc
IRCNAME=hsoub
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=octarine
LOGNAME=hsoub
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
MAILCHECK=60
MAIL=/var/mail/hsoub
MANPATH=/usr/man:/usr/share/man/:/usr/local/man:/usr/X11R6/man
MEAN_MACHINES=octarine
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/hsoub
OS=Linux
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:.
PS1=\[\033[1;44m\]hsoub is in \w\[\033[0m\]
PS2=More input>
PWD=/nethome/hsoub
SESSION_MANAGER=local/octarine.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=hsoub
USER=hsoub
_=/usr/bin/printenv
VISUAL=vi
WINDOWID=20971661
XAPPLRESDIR=/nethome/hsoub/app-defaults
XAUTHORITY=/nethome/hsoub/.Xauthority
XENVIRONMENT=/nethome/hsoub/.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 أيضًا:

hsoub ~> diff set.sorted printenv.sorted | grep "<" | awk '{ print $2 }'
BASE=/nethome/hsoub/.Shell/hq.garrels.be/octarine.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/hsoub
HISTFILE=/nethome/hsoub/.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/hsoub
UID=504

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

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

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

متغيرات نصية.

متغيرات عددية.

متغيرات ثابتة.

متغيرات المصفوفة.

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

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

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

كذلك فإن المتغيرات يمكن أن تحتوي أرقامًا بشرط ألا يبدأ اسم المتغير برقم:

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

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

VARNAME="value"

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

hsoub ~> MYVAR1="2"

hsoub ~> echo $MYVAR1
2

hsoub ~> first_name="Hsoub"

hsoub ~> echo $first_name
Hsoub

hsoub ~> full_name="Hsoub Alaraby"

hsoub ~> echo $full_name
Hsoub Alaraby

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

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

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

hsoub ~> unset MYVAR1 first_name full_name

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

hsoub ~>

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

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

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

export VARNAME="value"

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

hsoub ~> full_name="Hsoub Alaraby"

hsoub ~> bash

hsoub ~> echo $full_name


hsoub ~> exit

hsoub ~> export full_name

hsoub ~> bash

hsoub ~> echo $full_name
Hsoub Alaraby

hsoub ~> export full_name="Charles the Great"

hsoub ~> echo $full_name
Charles the Great

hsoub ~> exit

hsoub ~> echo $full_name
Hsoub Alaraby

hsoub ~>