将数字与全局模式匹配

将数字与全局模式匹配

我正在尝试使用全局模式进行匹配。然而,这场比赛失败了:

dgt='^+([0123456789])$'
[[ "$1" == $dgt  ]] && echo "SUCCESS" || echo "FAILURE"

答案1

您的模式^+([0123456789])$是扩展的通配模式和正则表达式的混合。通配模式不需要显式锚定,因为无论如何它总是锚定的。因此,以 开头^和结尾的通配模式$将匹配字符串开头和结尾的那些文字字符。如果您想使用通配模式并且不想^在开头和$结尾进行匹配,请删除它们。

您最终将得到以下代码:

#!/bin/bash

# Bash releases earlier than 4.1 needs to enable the extglob shell
# option.  For release 4.1+, the pattern used in [[ ]] is assumed
# to be an extended globbing pattern.
#
# shopt -s extglob

pattern='+([0123456789])'

if [[ $1 == $pattern ]]; then
   echo 'contains only digits'
else
   echo 'contains non-digit or is empty'
fi

在没有扩展通配模式的 shell 中,匹配非数字会更容易:

#!/bin/sh

case $1 in
    *[!0123456789]*)
        echo 'contains non-digit' ;;
    '')
        echo 'is empty' ;;
    *)
        echo 'contains only digits'
esac

bashshell 中,您也可以使用上面的代码,因为它是可移植的并且可以在所有sh兼容的 shell 中工作,或者您可以使用

#!/bin/bash

pattern='*[!0123456789]*'

if [[ $1 == $pattern ]]; then
   echo 'contains non-digit'
elif [ -z "$1" ]; then
   echo 'is empty'
else
   echo 'contains only digits'
fi

答案2

如果全局模式匹配不是绝对需要的,您也可以使用正则表达式。

在 Bash 中,您可以使用=~正则表达式运算符:

dgt='^[[:digit:]]+$'
[[ "$1" =~ $dgt ]] && echo "SUCCESS" || echo "FAILURE"

相关内容