Bash
將數字與 glob 模式匹配
我正在嘗試使用 glob 模式進行匹配。但是在使用的時候就失敗了
myfun 12
。dgt='^+([0123456789])$' [[ "$1" == $dgt ]] && echo "SUCCESS" || echo "FAILURE"
您的模式 ,
^+([0123456789])$
是擴展的 globbing 模式和正則表達式的混合。globbing 模式不需要顯式地錨定,因為無論如何它總是被錨定的。因此,以 開頭^
和結尾的萬用字元模式$
將匹配字元串開頭和結尾的那些文字字元。如果您想使用通配模式並且不想^
在開頭和$
結尾匹配,請刪除這些。您最終將得到以下程式碼:
#!/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
在沒有擴展 globbing 模式的 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