پرسش و پاسخ شماره ۶۶ - آموزش اسکریپت نویسی
X
تبلیغات
رایتل

آموزش اسکریپت نویسی

آموزش اسکریپت نویسی پوسته گنو-لینوکس

#!/bin/bash

پرسش و پاسخ شماره ۶۶

پرسش و پاسخ شماره ۶۶

می‌خواهم عبارت ‎if  [[ $var == foo || $var == bar || $var == more ... ]]‎ را بدون n مرتبه تکرار ‎$var‎، بررسی کنم.

چاره کار استفاده از case می‌باشد:

   # Bourne
   case "$var" in
      foo|bar|more) ... ;;
   esac

در Bash و ksh همین کار را‏، globهای توسعه یافته نیز می‌توانند در داخل فرمان ‎[[‎ انجام بدهند:

   # bash/ksh
   ${BASH_VERSION+shopt -s extglob}
   if [[ $var == @(foo|bar|more) ]]; then
      ...
   fi

به طور جایگزین، برای کنترل هر یک از اقلام لیست الگوها، می‌توانید یک حلقه بر روی آنها به کار ببرید.

    # bash/ksh93/zsh (w/ emulate ksh)

    # usage: pmatch string pattern [ pattern ... ]
    function pmatch {
        ${1+typeset x=}"${1-false}" &&
        while command shift; do
            [[ $x == $1 ]] && return
        done 2>/dev/null
        return 1
    }

    var='foo bar'
    if pmatch "$var" foo bar baz foo\* blarg; then
        : ...
    fi

ksh93 برای اجتماع(و) منطقی(اگر ‎$var‎ بر تمام الگوها منطبق شود، صحیح را برگشت می‌دهد)، می‌تواند از جداکننده الگوی & استفاده کند.

    # ksh93 فقط در پوسته‎
    [[ $var == @(foo&bar&more) ]] && ...

تنها برای پوسته‌هایی که (الگوهای extglob) زیرمجموعه ksh88 را پشتیبانی می‌کنند، می‌توانید استفاده منطقی از عملگر نفی الگوی فرعی را مطابق قوانین DeMorgan استفاده کنید. زیرنویس 1

    # bash/ksh88/etc...
    ${BASH_VERSION+shopt -s extglob}
    [[ $var == !(!(foo)|!(bar)|!(more)) ]] && ...

اما این مورد کاملا غیر شفاف است و خیلی کوتاه‌تر از نوشتن عبارتهای جداگانه برای هر الگو نیز نمی‌باشد.


CategoryShell

پرسش و پاسخ 66 (آخرین ویرایش ‎2013-01-14 22:03:43‎ توسط ormaaj)


  1. مترجم: مطابق قوانین تبدیل De Morgan در منطق گزاره‌ای:

    نفی (A و B) معادل است با (نفی A) یا (نفی B)‏ و به بیان دیگر ‎!(A & B)‎ معادل ‎(!A) | (!B)‎ است
    و همچنین:
    نفی (A یا B) معادل است با (نفی A) و (نفی B) به عبارتی ‎!(A | B)‎ همان ‎(!A) & (!B)‎ است

    (بازگشت)