我正在尝试使用全局模式进行匹配。然而,这场比赛失败了:
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
在bash
shell 中,您也可以使用上面的代码,因为它是可移植的并且可以在所有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"