
We are searching data for your request:
Upon completion, a link will appear to access the found materials.
6.0 حذف القط foo / tmp / bar ، cat / tmp / bar & gt ، / tmp / foo
7.0. /bar: لا يوجد مثل هذا الملف أو الدليل
7.0. / foo: لا يوجد مثل هذا الملف أو الدليل
7.0 ./foo / tmp / bar: لا يوجد مثل هذا الملف أو الدليل
7.0 ./bar / tmp / foo: لا يوجد مثل هذا الملف أو الدليل
7.0 ./bar / tmp / foo / tmp / bar: لا يوجد مثل هذا الملف أو الدليل
7.0
أ:
يرجع السلوك الذي تراه إلى استخدامك لميزة globbing الخاصة بالصدفة. إذا كنت تريد أن يتصرف أمر cat بالطريقة التي تصفها ، فيجب عليك إجراء مقارنة متقطعة صراحة.
إذا ["$ a" = "$ (echo $ a | cut -f1 -d /)"] ، إذن
مباراة صدى
آخر
صدى لا يتطابق
فاي
يتم استخدام أمر القطع لإجراء عملية خفقان أولية.
صدى $ "foo / bar" | قطع -f1 -d /
فو
صدى $ "foo / bar" | قطع -f1 -d /
شريط
تعمل عبارة if بعد ذلك على إجراء مقارنة globbing وتقيم فقط تعبير shell إذا تطابق globbing.
بشكل عام ، يعد إجراء مقارنات globbing أكثر صعوبة في shell مقارنةً بلغات البرمجة التقليدية (Python ، Ruby ، إلخ) ، ومن الجيد التحقق مما إذا كنت تستخدم ميزات globbing بشكل مناسب.
أ:
لأنك تستخدم = not = ~ في الحالة.
عندما تفعل
a = $ (echo $ a | cut -f1 -d /)
إذا ["$ a" = "$ (echo $ a | cut -f1 -d /)"]
من ثم
مباراة صدى
آخر
صدى لا يتطابق
فاي
عند المقارنة بهذا الشكل ، فإن a لا يساوي $ (echo $ a | cut -f1 -d /) الذي لا يساوي السلسلة الفارغة بسبب المسافة.
لإصلاح هذا يمكنك القيام به
إذا ["$ a" = "$ (echo $ a | cut -f1 -d /)"]
من ثم
مباراة صدى
آخر
صدى لا يتطابق
فاي
أ:
a = $ (echo $ a | cut -f1 -d /)
تحتاج إلى استخدام علامات الاقتباس المزدوجة حول = ، وإضافة] إلى النهاية. هذا من شأنه أن يعطيك ما تريد.
a = $ (echo $ a | cut -f1 -d /)
إذا ["$ a" = "$ (echo $ a | cut -f1 -d /)"]
إذا لم تقم بإضافة] إلى نهاية البرنامج النصي الخاص بك ، فسيتم تقييم ["bar" = "foo / bar"] إلى true ، لأنه يعتقد أن "bar" = "foo /" هو تعبير صالح. لن يعمل الجزء الأول أيضًا عند إضافة] إلى النهاية. يجب أن يكون مقتبسًا مرتين.
أسهل طريقة لقراءة قيمة $ a (وقيمتها في أي وقت في النص البرمجي) هي استخدام [وبيان الحالة.
a = $ (echo $ a | cut -f1 -d /)
حالة $ a في
/ foo / bar /) صدى "a is 'foo / bar'"، a = '' ،،
*) صدى "a ليس 'foo / bar'" ، a = 'foo / bar' ،،
esac
إذا ["$ a" = "$ (echo $ a | cut -f1 -d /)"]
يأخذ هذا قيمة $ a ويتحقق منها مقابل قيمة معروفة. ثم تعيد تعليمة الحالة هذه $ a إلى القيمة المعروفة. إذا لم تكن قيمة $ a إحدى القيم الصالحة ، فسيتم طباعة رسالة الخطأ على الشاشة.
باستخدام هذه الطريقة ، لا توجد مشاكل مع علامات الاقتباس المزدوجة والمفردة ، وستعمل بشكل صحيح في جميع الحالات التي لا يعمل فيها الإصدار الحالي.
هناك طريقة أخرى أكثر أناقة للقيام بذلك وهي استخدام بعض امتدادات جنو.
إذا [["$ a" = "$ (echo $ a | cut -f1 -d /)"]]
[[يتم تقييم الأمر إلى صحيح إذا كانت السلسلة التي تم تقديمها فارغة. نظرًا لأن الاختبار يتم تقييمه على أساس سلسلة فارغة ، وليس بقيمة $ a ، فإن هذا يعد أكثر كفاءة.