English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

عمليات الحساب الأساسية في Shell

Shell 和其他编程语言一样,支持多种运算符,包括:

  • 算数运算符

  • علامات الحساب

  • عمليات منطقية

  • عمليات النصوص

  • عوامل اختبار الملفات

原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):

#!/bin/bash
val=`expr 2 + 2`
echo "两数之和为 : $val"

تنفيذ السكربت، والنتائج التالية كالتالي:

两数之和为 : 4

两点注意:

  •             表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。

  •             完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

算术运算符

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:

                عمليات                شرح                مثال
                +                加法                `expr $a + $b` 结果为 30。
                -                减法                `expr $a - $b` 结果为 -10。
                *                乘法                `expr $a * $b` 结果为 200。
                /                除法                `expr $b / $a` 结果为 2。
                %                取余                `expr $b % $a` 结果为 0。
                =                赋值                a=$b 将把变量 b 的值赋给 a。
                ==                相等。用于比较两个数字,相同则返回 true。                [ $a == $b ] 返回 false。
                !=                不相等。用于比较两个数字,不相同则返回 true。                [ $a != $b ] 返回 true。

ملاحظة:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]

مثال آنلاين

算术运算符示例如下:

مثال آنلاين

#!/bin/bash
# author: أساسيات التعليمات
# url:ar.oldtoolbag.com
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a * $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
إطبع "b % a : $val"
إذا كان [ $a == $b ]
then
   إطبع "a يساوي b"
fi
if [ $a != $b ]
then
   إطبع "a لا يساوي b"
fi

تنفيذ السكربت، والنتائج التالية كالتالي:

a + b : 30
a - b : -10
a * b : 200
b / a : 2
b % a : 0
a لا يساوي b

ملاحظة:

  •                     يجب إضافة شرطي علامة النهاية (\) قبل علامة التبديل (*) لتنفيذ عملية الضرب.

  •                     if...then...fi هي جملة شرطية، سيتم شرحها لاحقاً.

  • قواعد النصوص في shell في MAC هي:$(( تعبير ))،لا تحتاج إلى تحويل العلامة "*" في تعبير هذا إلى "\\".

علامات الحساب

تدعم علامات الحساب فقط الأرقام، ولا تدعم الأحرف، إلا إذا كانت قيمة الأحرف أرقاماً.

الجدول التالي يعرض العلامات الحسابية الشائعة، يفترض أن المتغير a هو 10، والمتغير b هو 20:

                    عمليات                    شرح                    مثال
                    -eq                    تحقق من whether the two numbers are equal, if they are equal, return true.                    [ $a -eq $b ] يعود إلى false.
                    -ne                    تحقق من whether the two numbers are not equal, if they are not equal, return true.                    [ $a -ne $b ] يعود إلى true.
                    -gt                    تحقق من whether the number on the left is greater than the number on the right, if it is, then return true.                    [ $a -gt $b ] يعود إلى false.
                    -lt                    تحقق من whether the number on the left is less than the number on the right, if it is, then return true.                    [ $a -lt $b ] يعود إلى true.
                    -ge                    تحقق من whether the number on the left is greater than or equal to the number on the right, if it is, then return true.                    [ $a -ge $b ] يعود إلى false.
                    -le                    تحقق من whether the number on the left is less than or equal to the number on the right, if it is, then return true.                    [ $a -le $b ] يعود إلى true.

مثال آنلاين

مثال على علامات الحساب التالية:

#!/bin/bash
# author:موقع أساسيات التعليمات
# url:ar.oldtoolbag.com
a=10
b=20
إذا كان [ $a -eq $b ]
then
   إطبع "$a -eq $b : a يساوي b"
else
   إطبع "$a -eq $b: a لا يساوي b"
fi
إذا كان [ $a -ne $b ]
then
   إطبع "$a -ne $b: a لا يساوي b"
else
   إطبع "$a -ne $b : a يساوي b"
fi
إذا كان [ $a -gt $b ]
then
   إطبع "$a -gt $b: a أكبر من b"
else
   إطبع "$a -gt $b: a لا يزيد عن b"
fi
إذا كان [ $a -lt $b ]
then
   إطبع "$a -lt $b: a أقل من b"
else
   إطبع "$a -lt $b: a لا يقل عن b"
fi
إذا كان [ $a -ge $b ]
then
   echo "\$a -ge \$b: a أكبر أو يساوي b"
else
   echo "\$a -ge \$b: a أقل من b"
fi
if [ \$a -le \$b ]
then
   echo "\$a -le \$b: a أقل أو يساوي b"
else
   echo "\$a -le \$b: a أكبر من b"
fi

تنفيذ السكربت، والنتائج التالية كالتالي:

10 -eq 20: a يساوي b
10 -ne 20: a غير يساوي b
10 -gt 20: a لا يساوي b
10 -lt 20: a أقل من b
10 -ge 20: a أقل من b
10 -le 20: a أقل أو يساوي b

عمليات منطقية

الجدول أدناه يبين عمليات منطقية مستخدمة بشكل شائع، مع افتراض أن المتغير a يساوي 10 ومتغير b يساوي 20:

                    عمليات                    شرح                    مثال
                    !                    عمليات منطقية 'لا': إذا كانت العبارة صحيحة فإنها تعود false، وإذا كانت غير صحيحة فإنها تعود true.                    [ ! false ] يعود true.
                    -o                    عمليات منطقية 'أو': يعود true إذا كانت إحدى العبارتين صحيحة.                    [ \$a -lt 20 -o \$b -gt 100 ] يعود true.
                    -a                    عمليات منطقية 'وال': يعود true فقط إذا كانت كلا العبارتين صحيحتان.                    [ \$a -lt 20 -a \$b -gt 100 ] يعود false.

مثال آنلاين

أمثلة على عمليات منطقية كما يلي:

#!/bin/bash
# author: أساسيات التعليمات
# url:ar.oldtoolbag.com
a=10
b=20
if [ $a != $b ]
then
   echo "$a != $b : a لا يساوي b"
else
   echo "\$a == \$b: a يساوي b"
fi
if [ \$a -lt 100 -a \$b -gt 15 ]
then
   echo "\$a أقل من 100 وأو \$b أكبر من 15: يعود true"
else
   echo "\$a أقل من 100 وأو \$b أكبر من 15: يعود false"
fi
if [ \$a -lt 100 -o \$b -gt 100 ]
then
   echo "\$a أقل من 100 أو \$b أكبر من 100: يعود true"
else
   echo "\$a أقل من 100 أو \$b أكبر من 100: يعود false"
fi
if [ \$a -lt 5 -o \$b -gt 100 ]
then
   echo "\$a أقل من 100 أو \$b أكبر من 100: يعود true"
else
   echo "\$a أقل من 5 أو \$b أكبر من 100: يعود false"
fi

تنفيذ السكربت، والنتائج التالية كالتالي:

10 != 20: a غير يساوي b
10 أقل من 100 وأو 20 أكبر من 15: يعود true
10 أقل من 100 أو 20 أكبر من 100: يعود true
10 أقل من 5 أو 20 أكبر من 100: يعود false

عمليات الحساب المنطقي

سيتم شرح عمليات الحساب المنطقي في Shell، افترض أن المتغير a هو 10، والمتغير b هو 20:

                    عمليات                    شرح                    مثال
                    &&                    و منطقي                    [[ $a -lt 100 && $b -gt 100 ]] يعود إلى false
                    ||                    أو منطقي                    [[ $a -lt 100 || $b -gt 100 ]] يعود إلى true

مثال آنلاين

مثال على عمليات الحساب المنطقي كالتالي:

#!/bin/bash
# author:موقع أساسيات التعليمات
# url:ar.oldtoolbag.com
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "يعود إلى true"
else
   echo "يعود إلى false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
   echo "يعود إلى true"
else
   echo "يعود إلى false"
fi

تنفيذ السكربت، والنتائج التالية كالتالي:

يعود إلى false
يعود إلى true

عمليات النصوص

الجدول التالي يوضح العمليات النصية الشائعة، افترض أن المتغير a هو "abc"، والمتغير b هو "efg":

                    عمليات                    شرح                    مثال
                    =                    تحقق من أن النصوص متساوية، إذا كانت متساوية يعود إلى true.                    [ $a = $b ] يعود إلى false.
                    !=                    تحقق من أن النصوص غير متساوية، إذا كانت غير متساوية يعود إلى true.                    [ $a != $b ] يعود إلى true.
                    -z                    تحقق من أن طول النص هو 0، إذا كان 0 يعود إلى true.                    [ -z $a ] يعود إلى false.
                    -n                    تحقق من أن طول النص ليس 0، إذا لم يكن 0 يعود إلى true.                    [ -n "$a" ] يعود إلى true.
                    $                    تحقق من أن النص فارغ، إذا لم يكن فارغًا يعود إلى true.                    [ $a ] يعود إلى true.

مثال آنلاين

مثال على عمليات النصوص كالتالي:

#!/bin/bash
# author:موقع أساسيات التعليمات
# url:ar.oldtoolbag.com
a="abc"
b="efg"
if [ $a = $b ]
then
   echo "$a = $b : a يساوي b"
else
   echo "$a = $b: a لا يساوي b"
fi
if [ $a != $b ]
then
   echo "$a != $b : a لا يساوي b"
else
   echo "$a != $b: a يساوي b"
fi
if [ -z $a ]
then
   echo "-z $a : طول النص هو 0"
else
   echo "-z $a : طول النص ليس 0"
fi
if [ -n "$a" ]
then
   echo "-n $a : طول النص ليس 0"
else
   echo "-n $a : طول النص هو 0"
fi
if [ $a ]
then
   echo "$a : النص غير فارغ"
else
   echo "$a : النص فارغ"
fi

تنفيذ السكربت، والنتائج التالية كالتالي:

abc = efg: a لا يساوي b
abc != efg : a لا يساوي b
-z abc : لا تكون طول السلسلة 0
-n abc : لا تكون طول السلسلة 0
abc : لا تكون السلسلة فارغة

عوامل اختبار الملفات

عوامل اختبار الملفات تستخدم لتحديد مختلف الخصائص لملفات Unix.

وصف الخصائص كما يلي:

                    عوامل                    شرح                    مثال
                    -b file                    التحقق من أن الملف هو جهاز مسطحة، وإذا كان جهاز مسطحة، يعود بـ true.                    [ -b $file ] يعود بـ false.
                    -c file                    التحقق من أن الملف هو جهاز نصي، وإذا كان جهاز نصي، يعود بـ true.                    [ -c $file ] يعود بـ false.
                    -d file                    التحقق من أن الملف هو دليل، وإذا كان دليلًا، يعود بـ true.                    [ -d $file ] يعود بـ false.
                    -f file                    التحقق من أن الملف هو ملف عادي (ليس دليلًا ولا هو جهاز)، وإذا كان ملفًا عاديًا، يعود بـ true.                    [ -f $file ] يعود بـ true.
                    -g file                    التحقق من أن الملف قام بضبط SGID، وإذا كان قام بضبط SGID، يعود بـ true.                    [ -g $file ] يعود بـ false.
                    -k file                    التحقق من أن الملف قام بضبط Stick Bit، وإذا كان قام بضبط Stick Bit، يعود بـ true.                    [ -k $file ] يعود بـ false.
                    -p file                    التحقق من أن الملف هو أنبوب مأخوذ، وإذا كان هو أنبوب مأخوذ، يعود بـ true.                    [ -p $file ] يعود بـ false.
                    -u file                    التحقق من أن الملف قام بضبط SUID، وإذا كان قام بضبط SUID، يعود بـ true.                    [ -u $file ] يعود بـ false.
                    -r file                    التحقق من أن الملف قابل للقراءة، وإذا كان قابل للقراءة، يعود بـ true.                    [ -r $file ] يعود بـ true.
                    -w file                    التحقق من أن الملف قابل للكتابة، وإذا كان قابل للكتابة، يعود بـ true.                    [ -w $file ] يعود بـ true.
                    -x file                    التحقق من أن الملف قابل للتنفيذ، وإذا كان قابلاً للتنفيذ، يعود بـ true.                    [ -x $file ] يعود بـ true.
                    -s file                    التحقق من أن الملف فارغًا (ما إذا كان حجم الملف أكبر من 0)، وإذا لم يكن فارغًا، يعود بـ true.                    [ -s $file ] يعود بـ true.
                    -e file                    التحقق من وجود الملف (بما في ذلك الدلائل) وأنه موجود، وإذا كان موجودًا، يعود بـ true.                    [ -e $file ] يعود بـ true.

حروف التحقق الأخرى:

  • -S: التحقق من أن الملف هو socket.

  • -L: التحقق من وجود الملف وأنه رابط رمزي.

مثال آنلاين

المتغير file يمثل الملف /var/www/w3codebox/test.sh، حجمه 100 بايت، ويحتوي على rwx الإذن. الكود التالي سيقوم بفحص خصائص الملف المختلفة:
#!/bin/bash
# author:موقع أساسيات التعليمات
# url:ar.oldtoolbag.com
file="/var/www/w3codebox/test.sh"
if [ -r $file ]
then
   echo "الملف قابل للقراءة"
else
   echo "الملف غير قابل للقراءة"
fi
if [ -w $file ]
then
   echo "الملف قابل للكتابة"
else
   echo "الملف غير قابل للكتابة"
fi
if [ -x $file ]
then
   echo "الملف قابل للتنفيذ"
else
   echo "الملف غير قابل للتنفيذ"
fi
if [ -f $file ]
then
   echo "الملف هو ملف عادي"
else
   echo "الملف هو ملف خاص"
fi
if [ -d $file ]
then
   echo "الملف هو مجلد"
else
   echo "الملف ليس مجلداً"
fi
if [ -s $file ]
then
   echo "الملف ليس فارغاً"
else
   echo "الملف فارغ"
fi
if [ -e $file ]
then
   echo "يوجد ملف"
else
   echo "لا يوجد ملف"
fi

تنفيذ السكربت، والنتائج التالية كالتالي:

الملف قابل للقراءة
الملف قابل للكتابة
الملف قابل للتنفيذ
الملف هو ملف عادي
الملف ليس مجلداً
لا يحتوي الملف على أي بيانات
يوجد الملف