عمليات السلاسل
هناك مجموعة كبيرة من التوسعات التي يمكن استخدامها للعمل على سلاسل. العديد من هذه التوسعات مناسبة بشكل خاص للعمليات على أسماء المسار.
{# دولارالمعلمة}
يتوسع في طول السلسلة التي يحتوي عليها المعلمة. بشكل طبيعي، المعلمة هو سلسلة ومع ذلك، إذا المعلمة اما @ or *، ثم ينتج عن التوسع عدد المعلمات الموضعية.
[me @ linuxbox ~] $ foo = "هذه السلسلة طويلة."
[me @ linuxbox ~] $ صدى "'$ foo' يتكون من $ {# foo} حرفًا."
"هذه السلسلة طويلة". 20 حرفًا.
[me @ linuxbox ~] $ foo = "هذه السلسلة طويلة."
[me @ linuxbox ~] $ صدى "'$ foo' يتكون من $ {# foo} حرفًا."
"هذه السلسلة طويلة". 20 حرفًا.
${المعلمة:عوض}
${المعلمة:عوض:الطول}
تُستخدم هذه التوسعات لاستخراج جزء من السلسلة المضمنة في المعلمة. يبدأ الاستخراج في عوض من بداية السلسلة وتستمر حتى نهاية السلسلة ، ما لم يكن الطول محدد.
[me @ linuxbox ~] $ foo = "هذه السلسلة طويلة."
[me @ linuxbox ~] $ صدى $ {foo: 5}
السلسلة طويلة.
[me @ linuxbox ~] $ صدى $ {foo: 5: 6}
سلسلة
[me @ linuxbox ~] $ foo = "هذه السلسلة طويلة."
[me @ linuxbox ~] $ صدى $ {foo: 5}
السلسلة طويلة.
[me @ linuxbox ~] $ صدى $ {foo: 5: 6}
سلسلة
إذا كانت قيمة عوض سلبية ، فهي تعني أنها تبدأ من نهاية السلسلة وليس من البداية. لاحظ أن القيم السالبة يجب أن تسبقها مسافة لمنع الالتباس مع ${المعلمة:-كلمة} توسيع. الطول، إذا كان موجودًا ، يجب ألا يقل عن الصفر.
If المعلمة is @، نتيجة التوسع الطول المعلمات الموضعية ، بدءًا من
عوض.
[me @ linuxbox ~] $ foo = "هذه السلسلة طويلة."
[me @ linuxbox ~] $ صدى $ {foo: -5}
طويل.
[me @ linuxbox ~] $ صدى $ {foo: -5: 2}
lo
[me @ linuxbox ~] $ foo = "هذه السلسلة طويلة."
[me @ linuxbox ~] $ صدى $ {foo: -5}
طويل.
[me @ linuxbox ~] $ صدى $ {foo: -5: 2}
lo
${المعلمة#النمط}
${المعلمة##النمط}
تزيل هذه التوسعات الجزء الأول من السلسلة المضمنة في المعلمة يحددها النمط. النمط هو نمط حرف بدل مثل تلك المستخدمة في توسيع اسم المسار. الاختلاف في الشكلين هو أن # يزيل النموذج أقصر تطابق ، بينما يزيل ملف ## الشكل يزيل أطول مباراة.
[me @ linuxbox ~] $ foo = file.txt.zip [me @ linuxbox ~] $ صدى $ {foo # *.} txt.zip
[me @ linuxbox ~] $ صدى $ {foo ## *.}
الرمز البريدي
[me @ linuxbox ~] $ foo = file.txt.zip [me @ linuxbox ~] $ صدى $ {foo # *.} txt.zip
[me @ linuxbox ~] $ صدى $ {foo ## *.}
الرمز البريدي
${المعلمة%النمط}
${المعلمة%%النمط}
هذه التوسعات هي نفسها # و ## الامتدادات أعلاه ، إلا أنها تزيل النص من نهاية السلسلة المضمنة في المعلمة وليس منذ البداية.
[me @ linuxbox ~] $ foo = file.txt.zip
[me @ linuxbox ~] $ foo = file.txt.zip
[me @ linuxbox ~] $ صدى $ {foo٪. *}
ملف.txt
[me @ linuxbox ~] $ صدى $ {foo ٪٪. *}
ملف
[me @ linuxbox ~] $ صدى $ {foo٪. *}
ملف.txt
[me @ linuxbox ~] $ صدى $ {foo ٪٪. *}
ملف
${المعلمة/النمط/سلسلة}
${المعلمة//النمط/سلسلة}
${المعلمة/#النمط/سلسلة}
${المعلمة/%النمط/سلسلة}
يقوم هذا التوسيع بإجراء بحث واستبدال على محتويات المعلمة. إذا تم العثور على نص يطابق حرف البدل النمط، يتم استبداله بمحتويات سلسلة. في الشكل العادي ، فقط التواجد الأول لـ النمط يتم استبدال. في ال // النموذج ، يتم استبدال جميع التكرارات. ال /# يتطلب الشكل أن تحدث المطابقة في بداية السلسلة ، و /% يتطلب النموذج حدوث المطابقة في نهاية السلسلة. في كل شكلسلسلة قد يتم حذفها ، مما يتسبب في مطابقة النص بـ النمط للحذف.
[me @ linuxbox ~] $ foo = JPG.JPG [me @ linuxbox ~] $ صدى $ {foo / JPG / jpg} jpg.JPG
[me @ linuxbox ~] $ صدى $ {foo // JPG / jpg}
jpg.jpg
[me @ linuxbox ~] $ صدى $ {foo / # JPG / jpg}
jpg.JPG
[me @ linuxbox ~] $ صدى $ {foo /٪ JPG / jpg}
JPG.jpg
[me @ linuxbox ~] $ foo = JPG.JPG [me @ linuxbox ~] $ صدى $ {foo / JPG / jpg} jpg.JPG
[me @ linuxbox ~] $ صدى $ {foo // JPG / jpg}
jpg.jpg
[me @ linuxbox ~] $ صدى $ {foo / # JPG / jpg}
jpg.JPG
[me @ linuxbox ~] $ صدى $ {foo /٪ JPG / jpg}
JPG.jpg
توسيع المعلمة أمر جيد يجب معرفته. يمكن استخدام توسعات معالجة السلسلة كبدائل للأوامر الشائعة الأخرى مثل عطش و مختون. يمكن للتوسعات تحسين كفاءة البرامج النصية من خلال القضاء على استخدام البرامج الخارجية. على سبيل المثال ، سوف نقوم بتعديل أطول كلمة تمت مناقشة البرنامج في الفصل السابق لاستخدام توسيع المعلمة $ {# ي} بدلا من استبدال الأوامر $ (صدى
-n $ j | wc -c) والقشرة الفرعية الناتجة ، مثل:
#! / بن / باش
# longest-word3: البحث عن أطول سلسلة في ملف لـ i ؛ فعل
إذا [[-r $ i]]؛ ثم max_word = max_len = 0
#! / بن / باش
# longest-word3: البحث عن أطول سلسلة في ملف لـ i ؛ فعل
إذا [[-r $ i]]؛ ثم max_word = max_len = 0
لـ j in $ (سلاسل $ i) ؛ فعل
لين = $ {# j}
إذا ((len> max_len)) ؛ ثم max_len = $ len max_word = $ j
fi
فعل
صدى "$ i: '$ max_word' (أحرف max_len $)"
انتهى فاي
لـ j in $ (سلاسل $ i) ؛ فعل
لين = $ {# j}
إذا ((len> max_len)) ؛ ثم max_len = $ len max_word = $ j
fi
فعل
صدى "$ i: '$ max_word' (أحرف max_len $)"
انتهى فاي
بعد ذلك ، سنقارن بين كفاءة النسختين باستخدام امتداد الوقت أمر:
[me @ linuxbox ~] $ أطول وقت-word2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: "scrollkeeper-get-extended-content-list" (38 حرفًا)
[me @ linuxbox ~] $ أطول وقت-word2 dirlist-usr-bin.txt
dirlist-usr-bin.txt: "scrollkeeper-get-extended-content-list" (38 حرفًا)
حقيقي
المستخدم
0m3.618s
0m1.544s
حقيقي
المستخدم
0 م 1.768 ثانية
[me @ linuxbox ~] $ أطول وقت-word3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: "scrollkeeper-get-extended-content-list" (38 حرفًا)
0 م 1.768 ثانية
[me @ linuxbox ~] $ أطول وقت-word3 dirlist-usr-bin.txt
dirlist-usr-bin.txt: "scrollkeeper-get-extended-content-list" (38 حرفًا)
حقيقي
المستخدم
0m0.060s
0m0.056s
حقيقي
المستخدم
0 م 0.008 ثانية
0 م 0.008 ثانية
يستغرق الإصدار الأصلي من البرنامج النصي 3.618 ثانية لمسح الملف النصي ، بينما يستغرق الإصدار الجديد ، باستخدام توسيع المعلمة ، 0.06 ثانية فقط - تحسن كبير جدا.