چاره کار استفاده از 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 برای اجتماع(
# ksh93 فقط در پوسته [[ $var == @(foo&bar&more) ]] && ...
تنها برای پوستههایی که (الگوهای extglob) زیرمجموعه ksh88 را پشتیبانی میکنند، میتوانید استفاده منطقی از عملگر نفی الگوی فرعی را مطابق قوانین DeMorgan استفاده کنید. زیرنویس 1
# bash/ksh88/etc... ${BASH_VERSION+shopt -s extglob} [[ $var == !(!(foo)|!(bar)|!(more)) ]] && ...
اما این مورد کاملا غیر شفاف است و خیلی کوتاهتر از نوشتن عبارتهای جداگانه برای هر الگو نیز نمیباشد.
پرسش و پاسخ 66 (آخرین ویرایش 2013-01-14 22:03:43 توسط ormaaj)
نفی (A و B) معادل است با (نفی A) یا (نفی B) و به بیان دیگر !(A & B) معادل (!A) | (!B) است
و همچنین:
نفی (A یا B) معادل است با (نفی A) و (نفی B) به عبارتی !(A | B) همان (!A) & (!B) است