$ i=0;$ ((i++))$ echo $i1$ Let i++$ echo $i2$ expr $i + 13$ echo $i2$ echo $i 1 awk '{printf $1+$2}'3
يوضح:
EXPRبعد
$i,
+، 1 مفصولة بمسافات. إذا تم إجراء الضرب، فيجب الهروب من العامل، وإلا فسوف تفسر Shell علامة الضرب على أنها حرف بدل، مما يؤدي إلى خطأ في بناء الجملة؛
محرجخلف
1 دولارو
2 دولارالرجوع على التوالي إلى
$iو1، أي الرقمين الأول والثاني من اليسار إلى اليمين.
استخدم أوامر Shell المضمنة لعرض أنواع كل أمر كما يلي:
نوع $ typetype عبارة عن غلاف مدمج $ type Letlet عبارة عن غلاف مدمج $ type exprexpr مجزأ (/usr/bin/expr) $ نوع bcbc مجزأ (/usr/bin/bc) نوع $ awkawk هو /usr/bin/awk
ويمكن ملاحظة ذلك من العرض التوضيحي أعلاه:
يتركإنه أمر مدمج في Shell، والعديد من الأوامر الأخرى هي أوامر خارجية، كلها موجودة
/usr/binدليل. و
EXPRو
قبل الميلادنظرًا لأنه تم استخدامه للتو، فقد تم تحميله في الذاكرة.
التجزئةطاولة. سيساعدنا هذا على فهم المبادئ الكامنة وراء طرق التنفيذ المختلفة للنصوص البرمجية التي تم تقديمها في الفصل السابق.
ملاحظة: إذا كنت تريد عرض التعليمات الخاصة بأوامر مختلفة، فاضغط على
يتركو
يكتبفي انتظار أمر Shell المدمج، يمكنك استخدام أمر Shell المدمج
يساعدلعرض المساعدة ذات الصلة، ويمكن الوصول إلى بعض الأوامر الخارجية من خلال أمر خارجي من Shell
رجللعرض المساعدة والاستخدام مثل
السماح للمساعدة,
manexprانتظر.
#!/bin/bash# calc.shi=0;while [ $i -lt 10000 ]do ((i++)) doeecho $i
الوصف: تمر هنا
بينما [التعبير الشرطي]؛ افعل .... تمدورة لتحقيق.
-لترأقل من علامة
<، انظر للحصول على التفاصيل
امتحاناستخدام الأمر:
اختبار الرجل.
كيفية تنفيذ هذا البرنامج النصي؟
الطريقة الأولى: تمرير ملف البرنامج النصي مباشرة كمعلمة لـ sub-Shell (Bash)
$ bash calc.sh $ نوع bashbash مجزأ (/bin/bash)
الطريقة الثانية: المرور
سحقالأوامر المضمنة
.أو
مصدرينفذ
$ ./calc.sh
أو
$ source ./calc.sh$ type .. عبارة عن غلاف مدمج من النوع $ sourcesource عبارة عن غلاف مدمج
الطريقة الثالثة: تعديل الملف ليكون قابلاً للتنفيذ وتنفيذه مباشرة ضمن Shell الحالي
$ شمود ./calc.sh $ ./calc.sh
بعد ذلك، سنوضح واحدًا تلو الآخر استخدام الطرق الأخرى لحساب المتغير زائد واحد، أي:
((ط++))سطر مع واحد مما يلي:
Let i++;i=$(expr $i + 1)i=$(echo $i+1|bc)i=$(echo $i 1 | awk '{printf $1+$2;}')
وقت حساب المقارنة هو كما يلي:
$ الوقت calc.sh10000real 0m1.319suser 0m1.056ssys 0m0.036s $ الوقت calc_let.sh10000real 0m1.426suser 0m1.176ssys 0m0.032s$ الوقت calc_expr.sh1000real 0m27.425suser 0m5.060ssys 0m14.177s$ الوقت calc_bc.sh1000real 0m56.576suser 0m9.353ssys 0m24.618s$ الوقت ./calc_awk.sh100real 0m11.672suser 0m2.604ssys 0m2.660s
يوضح:
وقتيمكن استخدام الأمر لحساب وقت تنفيذ الأمر، ويتضمن هذا الجزء من الوقت إجمالي وقت التشغيل ووقت تنفيذ مساحة المستخدم ووقت تنفيذ مساحة kernel
ptraceتنفيذ استدعاء النظام.
ومن خلال المقارنة أعلاه يتبين أن
(())لديه أعلى كفاءة تشغيلية. و
يتركباعتباره أمرًا مدمجًا في Shell، فهو أيضًا فعال للغاية، ولكن
EXPR,
قبل الميلاد,
محرجكفاءة الحساب منخفضة نسبيا. لذلك، إذا كانت شركة شل نفسها قادرة على إكمال العمل ذي الصلة، فمن المستحسن إعطاء الأولوية للوظائف التي توفرها شركة شل نفسها. ولكن هناك وظائف لا تستطيع Shell نفسها إكمالها، مثل عمليات الفاصلة العائمة، لذلك هناك حاجة إلى مساعدة من الأوامر الخارجية. بالإضافة إلى ذلك، مع الأخذ في الاعتبار إمكانية نقل نصوص Shell النصية، لا تستخدم بعض تركيبات Shell الخاصة عندما لا يكون الأداء حرجًا.
يترك,
EXPR,
قبل الميلاديمكن استخدامها للعثور على modulo، والمشغلين جميعا
%،و
يتركو
قبل الميلادويمكن استخدامه للعثور على العوامل الأسية مختلفة
**، هذا الأخير هو
^. على سبيل المثال:
$ expr 5 % 21$ Let i=5%2$ echo $i1$ echo 5 % 2$ ((i=5%2))$ echo $i1
$ Let i=5**2$ echo $i25$ ((i=5**2))$ echo $i25$ echo 5^2 bc25 |
يعد التحويل الأساسي أيضًا عملية شائعة نسبيًا
سحقدعم مدمج لـ
قبل الميلادلإكمال، على سبيل المثال، تحويل 11 من النظام الثماني إلى النظام العشري، يمكنك:
$ echo obase=10;ibase=8;11 |.bc -l9$ echo $((8#11))9
ما سبق هو تحويل الأرقام في نظام أساسي معين إلى الأساس 10. إذا كنت تريد التحويل بين أي أنظمة أساسية، فلا يزال
قبل الميلادأكثر مرونة لأنه يمكن استخدامه مباشرة
com.ibaseو
obaseحدد المصدر الأساسي وهدف التحويل الأساسي على التوالي.
إذا كنت تريد التعبير عن بعض السلاسل في قاعدة معينة، يمكنك استخدامها
التطوير التنظيميالأمر، مثل الفاصل الافتراضي
IFSبما في ذلك المساحات،
فاتورة غير مدفوعةبالإضافة إلى فواصل الأسطر، يمكنك استخدامها
رجل أسكيشهادة.
$ echo -n $IFS |. od -c0000000 t n0000003$ echo -n $IFS |.
يتركو
EXPRلا يمكن لأي منهما إجراء عمليات الفاصلة العائمة، ولكن
قبل الميلادو
محرجيستطيع.
$ مقياس الصدى = 1/13 |.bc.076$ echo 1 13 |
يوضح:
قبل الميلاديجب تحديد الدقة عند إجراء عمليات الفاصلة العائمة، وإلا فستكون القيمة الافتراضية 0، أي أنه عند إجراء عمليات الفاصلة العائمة، تحتفظ النتيجة الافتراضية بالأعداد الصحيحة فقط. و
محرجمرن جدًا عند التحكم في عدد المنازل العشرية، فقط بواسطة
printfيمكن تحقيق التحكم في التنسيق.
الملحق: قيد الاستخدام
قبل الميلادعند إجراء العمليات، إذا لم يتم استخدامها
حجمحدد الدقة أثناء الدخول
قبل الميلادأضف بعد
-لالخيار، يمكن أيضًا تنفيذ عمليات الفاصلة العائمة، ولكن الدقة الافتراضية في هذا الوقت هي 20 رقمًا. على سبيل المثال:
$ الصدى 1/13100 ق.م -ل.00007633587786259541
يستخدم
قبل الميلاد -ليمكن أن يحقق الحساب دقة عالية:
$ تصدير cos=0.996293; مقياس الصدى=100; a(sqrt(1-$cos^2)/$cos)*180/(a(1)*4) | -l4.9349547554113836327198340369318406051597063986552438753727649177325495504159766011527078286004072131
بالطبع يمكن استخدامه أيضًا
محرجلحساب:
$ echo 0.996293 |.awk '{ printf(%sn, atan2(sqrt(1-$1^2),$1)*180/3.1415926535);}'4.93495
يتم إنشاء مجموعة من بيانات الاختبار بشكل عشوائي هنا، واسم الملف هو
الدخل.txt.
1 3 44902 5 38963 4 31124 4 47165 4 45786 6 53997 3 50898 6 30299 4 619510 5 5145
ملحوظة: أعمدة البيانات الثلاثة أعلاه هي رقم الأسرة وحجم الأسرة وإجمالي دخل الأسرة الشهري.
التحليل: لكي تجد الأسرة ذات أعلى متوسط دخل شهري، عليك تقسيم العمودين التاليين، أي إيجاد متوسط الدخل الشهري لكل أسرة، ثم الفرز حسب متوسط الدخل الشهري لتجد الأسرة ذات أعلى متوسط دخل شهري أعلى دخل.
ينجز:
#!/bin/bash# gettopfamily.sh[ $# -lt 1 ] && echo الرجاء إدخال ملف الدخل &&exit -1[ ! -f $1 ] && echo $1 ليس ملفًا &&exit -1venue=$1awk '{ printf(%d %0.2fn, $1, $3/$2);}' $internetsort -k 2 -n -r
يوضح:
[ $# -lt 1 ]: يتطلب إدخال معلمة واحدة على الأقل،
$#هو عدد المعلمات التي تم تمريرها في Shell
[ ! -و $1 ]: يتطلب أن تكون معلمة الإدخال ملفًا،
-وللاستخدام، انظر
امتحانطلب،
اختبار الرجل
الدخل = 1 دولار: قم بتعيين معلمات الإدخال لمتغير الدخل، ثم استخدمها ك
محرجالمعلمات، أي الملفات المراد معالجتها
محرج: قم بتقسيم العمود الثالث من الملف على العمود الثاني للعثور على متوسط الدخل الشهري مع مراعاة الدقة، ويتم الاحتفاظ برقمين من الدقة.
فرز -ك 2 -ن -ر:هنا النتيجة
محرجالعمود الثاني من النتيجة
-ك 2أي أن متوسط الدخل الشهري يتم فرزه حسب الأرقام
-ن، وترتيبها تنازلياً
-ص.
العرض التوضيحي:
$ ./gettopfamily.sh الدخل.txt7 1696.339 1548.751 1496.674 1179.005 1144.5010 1029.006 899.832 779.203 778.008 504.83
الملحق: السابق
الدخل.txtيتم إنشاء البيانات بشكل عشوائي. عند إجراء بعض التجارب، غالبًا ما يكون من الضروري إنشاء بعض البيانات بشكل عشوائي. في القسم التالي، سنقدمها بالتفصيل. هنا يتم إنشاء
الدخل.txtالبرنامج النصي للبيانات:
#!/bin/bash# genrandomdata.shfor i in $(seq 1 10)do echo $i $(($RANDOM/8192+3)) $((RANDOM/10+3000))done
ملحوظة: يستخدم أيضًا في البرنامج النصي أعلاه
تسلسليقوم الأمر بإنشاء عمود من الأرقام من 1 إلى 10. سيتم تقديم الاستخدام التفصيلي لهذا الأمر في القسم الأخير من هذه المقالة.
متغيرات البيئة
عشوائيتوليد أرقام عشوائية من 0 إلى 32767، في حين
محرجل
راند ()يمكن للوظيفة إنشاء أرقام عشوائية بين 0 و 1.
$ echo $RANDOM81$ echo |.awk '{srand(); printf(%f, rand());}'0.237788
يوضح:
ساند ()في حالة عدم وجود معلمة، يتم استخدام الوقت الحالي كـ
راند ()مولد رقم عشوائي
بذرة.
يمكن أن تمر
عشوائيمجموع متدرج من المتغيرات
محرجوسط
راند ()لتحقيق التضخيم.
$ expr $RANDOM / 128$ echo |.awk '{srand();
التفكير: إذا كنت تريد إنشاء عنوان IP بشكل عشوائي لقطاع IP معين، فكيف يجب أن تفعل ذلك؟ انظر المثال: الحصول على عنوان IP صالح للاستخدام.
#!/bin/bash# getip.sh -- احصل على عنوان ipad قابل للاستخدام تلقائيًا# Author: falcon <[email protected]># التحديث: الثلاثاء 30 أكتوبر الساعة 23:46:17 CST 2007# قم بتعيين شبكتك الخاصة، البوابة الافتراضية ووقت انتهاء الأمر ping Commandnet=192.168.1default_gateway=192.168.1.1over_time=2# تحقق من الحالي ipaddressping -c 1 $default_gateway -W $over_time[ $? -eq 0 ] && صدى عنوان IP الحالي على ما يرام &&exit -1;while :; امسح التكوين الحالي ifconfig eth0 down # تكوين عنوان IP الخاص بـ eth0 ifconfig eth0 $net.$(($RANDOM /130 +2)) up # تكوين مسار البوابة الافتراضية إضافة gw الافتراضي $default_gateway # check التكوين الجديد ping -c 1 $default_gateway -W $over_time # إذا كان العمل، أنهي [ $? -eq 0 ] && Breakdone
ملاحظة: إذا لم يكن عنوان البوابة الافتراضية الخاص بك كذلك
192.168.1.1، يرجى تكوينه بنفسك
default_gateway(يمكن استخدامها
الطريق نأمر للعرض)، وذلك لأن استخدام
ifconfigعند تكوين العنوان، لا يمكنك تكوينه كعنوان البوابة، وإلا فسيكون عنوان IP الخاص بك هو نفس البوابة، مما يتسبب في عدم عمل الشبكة بالكامل بشكل صحيح.
في الواقع، يمكن إنشاء سلسلة من الأرقام من خلال حلقة، ولكن لماذا لا تستخدمها إذا كانت هناك أدوات ذات صلة!
تسلسلإنها أداة صغيرة يمكنها إنشاء سلسلة من الأرقام. يمكنك تحديد الفاصل الزمني المتزايد للأرقام، أو يمكنك تحديد الفاصل بين رقمين متجاورين.
$ تسلسل 512345 دولار تسلسل 1 512345 دولار تسلسل 1 2 5135 دولار تسلسل -s: 1 2 51:3:5 دولار تسلسل 1 2 14135791113 دولار تسلسل -w 1 2 1401030507091113 دولار تسلسل -s: -w 1 2 1401:03:05:07:09:11:13$ seq -f 0x%g 1 50x10x20x30x40x5
استخدام أكثر نموذجية
تسلسلعلى سبيل المثال، قم بإنشاء بعض الروابط بتنسيق معين، ثم استخدمها
wgetقم بتنزيل هذه:
$ for i in `seq -fhttp://thns.tsinghua.edu.cn/thnsebooks/ebook73/%02g.pdf 1 21`;do wget -c $i;
أو
$ for i in `seq -w 1 21`;do wget -c http://thns.tsinghua.edu.cn/thnsebooks/ebook73/$i تم
الملحق: في
سحقالإصدار 3 وما فوق، في
لدائري
فيمن الخلف، يمكنك المرور مباشرة
{1..5}قم بإنشاء أرقام من 1 إلى 5 بشكل أكثر دقة (لاحظ أن هناك نقطتين فقط بين 1 و5)، على سبيل المثال:
$ لـ i في {1..5}؛ افعل echo -n $i;
دعونا أولاً نعطي تعريفًا للكلمة: سلسلة أحرف مفردة أو متعددة مكونة من أحرف.
أولاً، قم بحساب عدد مرات ظهور كل كلمة:
$ wget -c http://tinylab.org$ cat Index.html |. sed -es/[^a-zA-Z]/n/g |
ثم قم بإحصاء الكلمات العشرة الأكثر تكرارًا:
$ wget -c http://tinylab.org$ cat Index.html |. sed -es/[^a-zA-Z]/n/g |. grep -v ^$ | -k 1 -r |. رئيس -10 524 أ 238 علامة 205 href 201 فئة 193 http 189 org 175 tinylab 174 www 146 div 128 عنوانا
يوضح:
مؤشر القط.html: إخراج محتويات ملف Index.html
sed -es/[^a-zA-Z]/n/g: استبدال الأحرف غير الأبجدية بمسافات، مع الاحتفاظ بالأحرف الأبجدية فقط
grep -v ^$: إزالة الأسطر الفارغة
نوع: نوع
يونيك -ج: احسب عدد الأسطر نفسها، أي عدد كل كلمة
فرز -ن -ك 1 -ص: وفقا للعمود الأول
-ك 1رقم
-نترتيب عكسي
-صنوع
الرأس -10: احذف الأسطر العشرة الأولى
يمكن النظر في نهجين:
قم بإحصاء الكلمات التي تحتاج إلى حسابها فقط
استخدم الخوارزمية المذكورة أعلاه لحساب عدد جميع الكلمات، ثم قم بإرجاع الكلمات التي تحتاج إلى حسابها للمستخدم
ومع ذلك، يمكن تنفيذ كلا الطريقتين من خلال البنية التالية. دعونا نلقي نظرة على الطريقة الأولى أولاً:
#!/bin/bash# statistic_words.shif [ $# -lt 1 ]; ثم صدى الاستخدام: الاسم الأساسي $0 FILE WORDS ....exit -1fiFILE=$1((WORDS_NUM=$#-1)) لـ n في $( seq $WORDS_NUM) do Shift cat $FILE |.sed -es/[^a-zA-Z]/n/g | ^$ |.grep ^$1$ |
يوضح:
إذا جزء الشرط: يتطلب معلمتين على الأقل، ملف الكلمة الأول، والمعلمات اللاحقة هي الكلمات التي سيتم حسابها.
الملف=1$: احصل على اسم الملف، وهو السلسلة الأولى بعد البرنامج النصي
((WORDS_NUM=$#-1)): احصل على عدد الكلمات، أي العدد الإجمالي للمعلمات
$#ناقص معلمة اسم الملف (1)
لجزء الحلقة: تمر أولا
تسلسلإنشاء سلسلة أرقام الكلمات التي تحتاج إلى عدها،
يحولهو متغير مدمج في Shell (يرجى المرور
مساعدة التحولالحصول على المساعدة)، فهو ينقل المعلمات التي مررها المستخدم من سطر الأوامر إلى الخلف بالتسلسل، ويستخدم المعلمة الحالية كمعلمة أولى.
1 دولار، مرت هكذا
1 دولاريمكنك اجتياز جميع الكلمات التي أدخلها المستخدم (إذا فكرت في الأمر بعناية، فسيبدو الأمر وكأنه مصفوفة منخفضة). يمكنك أن تنظر
يحولاستبدل الجملة التالية ب
صدى $1امتحان
يحولالاستخدام
العرض التوضيحي:
$ chmod +x statistic_words.sh$ ./statistic_words.sh Index.html tinylab لينكس بيثون 175 tinylab 43 لينكس 3 بيثون
دعونا نلقي نظرة على الطريقة الثانية، نحتاج فقط إلى التعديل
يحولالجملة التالية تكفي:
#!/bin/bash# statistic_words.shif [ $# -lt 1 ]; ثم خطأ الارتداد: يجب إدخال كلمتين على الأقل؛ استخدام الصدى: الاسم الأساسي $0 FILE WORDS ....exit -1fiFILE=$1((WORDS_NUM= $#-1)) لـ n في $(seq $WORDS_NUM)قم بإجراء تحويل cat $FILE | -es/[^a-zA-Z]/n/g |.grep -v ^$ |
العرض التوضيحي:
$ ./statistic_words.sh Index.html tinylab لينكس بيثون 175 tinylab 43 لينكس 3 بيثون
الشرح: من الواضح أن الطريقة الأولى هي أكثر كفاءة، لأنها تعثر على الكلمات التي يجب عدها مقدمًا ثم تقوم بعدها، في حين أن الطريقة الأخيرة ليست كذلك. في الواقع، إذا كنت تستخدم
grepل
-هالخيار، لا نحتاج إلى تقديم حلقة، ولكن يمكننا القيام بذلك باستخدام أمر واحد:
$ cat Index.html |. sed -es/[^a-zA-Z]/n/g |. grep -v ^$ |. grep -E ^tinylab$|^linux$ |
أو
$ cat Index.html |. sed -es/[^a-zA-Z]/n/g |.grep -v ^$ |.egrep ^tinylab$|^linux$ |
الوصف: بحاجة إلى الاهتمام
سيديمكن للأوامر معالجة الملفات مباشرة دون المرور
قطةيتم بعد ذلك تمرير إخراج الأمر عبر المسار، مما يمكن أن يقلل من عمليات المسار غير الضرورية، لذلك يمكن تبسيط الأمر أعلاه إلى:
$ sed -es/[^a-zA-Z]/n/g Index.html |. grep -v ^$ |.egrep ^tinylab$|^linux$ |
لذلك، يمكن أن نرى أن هذه الأوامر
سيد,
grep,
uniq,
نوععلى الرغم من أنها تؤدي وظائف بسيطة فقط من تلقاء نفسها، فمن خلال مجموعات معينة، يمكنها تحقيق مجموعة متنوعة من الأشياء. بالمناسبة، هناك أيضًا أمر مفيد جدًا لحساب الكلمات.
مرحاض -ث، كما يمكنك استخدامه عند الحاجة.
الملحق: تم ذكره أيضًا في كتاب دليل برمجة Bash المتقدم
مثقال ذرةأمر و
عاملالأمر، لأنه غير متوفر على الجهاز، لا يوجد اختبار.
عامليمكن للأمر إنشاء جميع الأعداد الأولية لعدد معين. يحب:
العامل $ 100100: 2 2 5 5
عند هذه النقطة، ينتهي الحساب العددي لمثال برمجة Shell. تقدم هذه المقالة بشكل رئيسي:
عمليات الأعداد الصحيحة، وعمليات الفاصلة العائمة، وتوليد الأرقام العشوائية، وتوليد التسلسل في برمجة Shell
الفرق بين أوامر شل المدمجة والأوامر الخارجية وكيفية عرض أنواعها والمساعدة
عدة طرق لتنفيذ البرامج النصية لـ Shell
العديد من أوامر Shell الخارجية شائعة الاستخدام:
سيد,
محرج,
grep,
uniq,
نوعانتظر
مثال: الحصول على أرقام متزايدة؛
الملكية الفكريةالعنوان؛ حساب عدد الكلمات
أخرى: تم تناول الاستخدامات ذات الصلة مثل قوائم الأوامر والاختبارات الشرطية وما إلى ذلك في الأمثلة المذكورة أعلاه، يرجى قراءتها بعناية.
إذا كان لديك الوقت، يرجى مراجعته.
دليل برمجة Bash المتقدم
قذيفة ثلاثة عشر سؤالا
اثنتا عشرة مقالة عن أساسيات الصدفة
دليل SED
دليل المستخدم AWK
العديد من منتديات شل للمناقشة
LinuxSir.org
ChinaUnix.net
استغرق الأمر أكثر من 3 ساعات لإنهاء الكتابة، الساعة الآن 23:33، حان وقت العودة إلى السكن والذهاب إلى السرير، وسأصحح الأخطاء المطبعية وأضيف بعض المحتوى غدًا.
وفي 31 أكتوبر تم تعديل بعض الصياغات وإضافة مثال لحساب متوسط دخل الأسرة الشهري وإضافة ملخص ومراجع وإلحاق جميع الرموز.
تعد برمجة Shell أمرًا مثيرًا للاهتمام للغاية، إذا فكرت في: المثال أعلاه لحساب متوسط دخل الأسرة الشهري، ثم استخدمه
م $ إكسلوبمقارنة هذا العمل، ستجد أن الأول بسيط جدًا وخالي من المتاعب، ويمنحك شعورًا بسهولة الاستخدام.