linux - كيف تقارن السلاسل في باش



4 Answers

أو إذا لم تكن بحاجة إلى شرط آخر:

[ "$x" == "valid" ] && echo "x has the value 'valid'"
Question

كيف أقوم بمقارنة متغير بسلسلة (ونفعل شيئًا إذا كان مطابقاً)؟




a="abc"
b="def"

# Equality Comparison
if [ "$a" == "$b" ]; then
    echo "Strings match"
else
    echo "Strings don't match"
fi

# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
    echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
    echo "$b is lexicographically smaller than $a"
else
    echo "Strings are equal"
fi

ملاحظات:

  1. المسافات بين if و [ and ] مهمة
  2. > و < مشغلات إعادة التوجيه حتى يفرغها مع \> و \< على التوالي للسلاسل.



لا بد لي من عدم الموافقة على أحد التعليقات في نقطة واحدة:

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

لا ، هذا ليس أونيلينيير مجنون

انها مجرد يبدو وكأنه واحد ل ، هم ، غير مطلقة ...

ويستخدم الأنماط الشائعة كلغة ، بطريقة ما ؛

و fter تعلمت اللغة.

في الواقع ، من الجميل أن تقرأ

إنه تعبير منطقي بسيط ، مع جزء خاص واحد: التقييم البطيء لمشغلي المنطق.

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

كل جزء هو تعبير منطقي. الأولى قد تكون صحيحة أو خاطئة ، والاثنان الآخران دائمًا صحيحان.

(
[ "$x" == "valid" ] 
&&
echo "valid"
)
||
echo "invalid"

الآن ، عندما يتم تقييمها ، يتم فحص الأول. إذا كانت خاطئة ، من المعامل الثاني للمنطق و && بعد أن لا تكون ذات صلة. الأولى ليست صحيحة ، لذلك لا يمكن أن يكون الأول والثاني صحيح ، على أي حال.
الآن ، في هذه الحالة هو الجانب الأول من المنطق أو || زائف ، ولكن يمكن أن يكون صحيحًا إذا كان الجانب الآخر - الجزء الثالث - صحيحًا.

لذلك سيتم تقييم الجزء الثالث - بشكل أساسي كتابة الرسالة كأثر جانبي. (لديها النتيجة 0 لصحيح ، والتي لا نستخدمها هنا)

الحالات الأخرى متشابهة ، ولكنها أبسط - وأعدك! هي - يمكن أن تكون - سهلة القراءة!
(ليس لدي واحد ، ولكن أعتقد أن كونه أحد محاربي UNIX ذوي اللحية الرمادية يساعد كثيراً في هذا.)




ربما أستخدم تطابقات regexp إذا كان الإدخال يحتوي على عدد قليل من الإدخالات الصالحة. على سبيل المثال فقط "البداية" و "توقف" هي إجراءات صالحة.

if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
  echo "valid action"
fi

لاحظ أن أحفظ المتغير $ACTION باستخدام الفاصلة المزدوجة. لاحظ أيضًا أن هذا لن يعمل على إصدارات باش قديمة جدًا.






Related