Bash

將數字與 glob 模式匹配

  • December 24, 2021

我正在嘗試使用 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

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

引用自:https://unix.stackexchange.com/questions/683674