string - سلسلة باش مقارنة مع القيم الصحيحة متعددة




bash comparison (3)

لدي قطعة bashscript التالية:

function get_cms {
    echo "input cms name"
    read cms
    cms=${cms,,}
    if [ "$cms" != "wordpress" && "$cms" != "meganto" && "$cms" != "typo3" ]; then
        get_cms
    fi
}

ولكن بغض النظر عن ما أقوم بإدخاله (القيم الصحيحة وغير الصحيحة) ، فإنه لا يستدعي الوظيفة مرة أخرى ، لأنني أريد فقط السماح لأحد هذه المدخلات الثلاثة. لقد جربتها مع || مع [ var != value ] or [ var != value1 ] or [ var != value1 ] لكن لا شيء يعمل. هل يستطيع احد توجيهي الي الوجهة الصحيحة؟


إذا كان القصد الرئيسي هو التحقق من عدم وجود القيمة المتوفرة في قائمة ، فبإمكانك استخدام مطابقة التعبير العادية الموسعة المضمنة في BASH عبر عامل التشغيل "المساواة في التلدة" (انظر أيضًا هذه الإجابة ):

if ! [[ "$cms" =~ ^(wordpress|meganto|typo3)$ ]]; then get_cms ; fi

أتمنى لك نهارا سعيد


إليكم الحل

if [[ "${cms}" != +(wordpress|magento|typo3) ]]; then

ربما يجب عليك استخدام case أفضل لهذه القوائم:

case "$cms" in
  wordpress|meganto|typo3)
    do_your_else_case
    ;;
  *)
    do_your_then_case
    ;;
esac

أعتقد أن مثل هذه القوائم الطويلة يمكن قراءتها بشكل أفضل.

إذا كنت لا تزال تفضل ما if يمكنك القيام بذلك باستخدام أقواس مفردة بطريقتين:

if [ "$cms" != wordpress -a "$cms" != meganto -a "$cms" != typo3 ]; then

أو

if [ "$cms" != wordpress ] && [ "$cms" != meganto ] && [ "$cms" != typo3 ]; then




compare