چاره کار استفاده از 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) است