大家好,欢迎来到IT知识分享网。
在Shell编程中,有时需要检查一个变量是否满足多个条件,例如var == bar || var 。以下是一些解决方案:
- 使用case语句。在Bourne shell中,可以使用以下方法:
# Bourne
case $var in
foo|bar|more) ... ;;
esac
- 在Bash和ksh中,可以使用扩展通配符。例如:
# bash/ksh
if [[ $var == @(foo|bar|more) ]]; then
...
fi
需要注意的是,在bash 4.1及更高版本中,默认在[[命令内部启用扩展通配符。如果需要针对较旧版本的bash进行编程,需要在脚本中打开它们(在所有函数或复合命令之外使用shopt -s extglob)。
- 循环遍历模式列表,逐个检查每个模式。例如:
# bash/ksh93
[[ -v BASH_VERSION ]] && shopt -s extglob
# usage: pmatch string pattern [ pattern ... ]
function any {
[[ -n $1 ]] || return
typeset pat match=$1
shift
for pat; do
[[ $match == $pat ]] && return
done
return 1
}
var='foo bar'
if any "$var" '@(bar|baz)' foo* blarg; then
echo 'var matched at least one of the patterns!'
fi
- 使用&模式分隔符进行逻辑合取(如果$var匹配所有模式则返回true),仅适用于ksh93。例如:
# ksh93 only
[[ $var == @(foo&bar&more) ]] && ...
- 对于仅支持ksh88子集(扩展通配符模式)的shell,可以使用否定子模式运算符来DeMorganify逻辑。例如:
# bash/ksh88/etc...
[[ $var == !(!(foo)|!(bar)|!(more)) ]] && ...
需要注意的是,这种方法不太清晰,也不比为每个模式编写单独的表达式更短。
更多
希望这些信息能够帮助你更好地学习Shell编程。想了解更多shell的更多编程技巧和编程最佳实践,可以关注我正在编写的《shell脚本编程最佳实践》。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/59600.html