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





string bash (9)


يمكنك أيضا استخدام حالة الاستخدام / esac

case "$string" in
 "$pattern" ) echo "found";;
esac

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




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

الفضاء في باش مهم جدا. هكذا سيتبع ذلك

[ "$LINE" != "table_name" ] 

ولكن بعد ذلك لن:

["$LINE" != "table_name"] 

لذا يرجى استخدام كما هو:

cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done



جرب هذا:

if [ "$x" = "valid" ]; then
  echo "x has the value 'valid'"
fi

إذا كنت تريد أن تفعل شيئًا عندما لا تتطابق ، استبدل = with != . أنت تريد علامات الاقتباس حول $x ، لأنه إذا كان $x فارغًا ، فستحصل على if [ = "valid" ]... وهو خطأ في بناء الجملة.

لاحظ أن bash يسمح باستخدام == مع [ ، ولكن هذا ليس قياسيًا. إما أن تستخدم [[ "$x" == "valid" ]] (وفي هذه الحالة ، تكون علامات الاقتباس حول $x اختيارية) أو [ "$x" = "valid" ] .




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

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

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




أنا فعلت هذا بهذه الطريقة متوافق مع bash، dash (sh):

testOutput="my test"
pattern="my"

case $testOutput in (*"$pattern"*)
    echo "if there is a match"
    exit 1
    ;;
(*)
   ! echo there is no coincidence!
;;esac



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 ذوي اللحية الرمادية يساعد كثيراً في هذا.)




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

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



يؤدي استخدام أنواع النظام إلى سهولة التنقل بين C # و VB.Net ، إذا كنت في هذا النوع من الأشياء.





linux string bash