매개변수의 범위를 설정할 수 있나요? [복사]

매개변수의 범위를 설정할 수 있나요? [복사]

나는 이 코드를 가지고 있습니다 :

if [[ $1 = "-s" ]] && [[ $2 = 0-9 ]]
then
  echo "yes"
fi

0-9는 나에게 적합하지 않습니다. 내가 정말로 원하는 것은 -x 3(또는 임의의 숫자)과 같은 것을 입력하는 것입니다.

답변1

if [[ $1 = "-s" ]] && [[ $2 -ge 0 ]] && [[ $2 -le 9 ]]

-ge: 이상

-le: 이하

답변2

가능하지만 문자 클래스( [0-9])를 사용해야 합니다. 예를 들어:

if [[ "$1" = "-s" ]] && [[ "$2" = [0-9] ]]
then
    echo "yes"
fi

단, 위의 내용은 $2단일 숫자로 구성된 경우에만 적용됩니다. $2하나 이상의 숫자를 포함 하려면 다음을 사용하십시오.

if [[ "$1" = "-s" ]] && [[ "$2" != *[!0-9]* && "$2" = [1-9]* ]]
then
    echo "yes"
fi

최신 bash 버전에서는 정규식을 사용할 수도 있습니다.

if [[ "$1" = "-s" ]] && [[ "$2" =~ ^[0-9]+$ ]]
then
    echo "yes"
fi

문자열의 ^시작과 끝을 일치시킵니다 . "0개 이상"을 $의미합니다 . +따라서 ^[0-9]*$이는 문자열에 처음부터 끝까지 하나 이상의 숫자만 포함된 경우에만 해당됩니다.

답변3

[ "${#1}${1#-s}" = "$((${2%%*[!0-9]*}0?2:-1))" ] &&
echo yes

...때때로 비교의 균형을 맞추면 테스트가 단축될 수 있습니다.

하지만 나는 선호합니다 case:

case ${1#-s}:$2 in
(*:*[!0-9]*|*:) ;;
("${1:+:$2}")   echo yes.
esac

기본적으로 아이디어는 제외하는 것입니다.어느숫자가 아닌 숫자와 일치합니다. 예를 들어:

[ "${2:+1$2}" = "1${2##*[!0-9]*}" ] && 
echo '"$2"' contains at least one character which \
         is a digit and zero which are not digits.

case여러 지점이 있으므로 이는 훨씬 간단합니다 .

case $1:$2 in
(*:*?"$2")
    echo '"$1"' contains a "':'";;
(*:*[!0-9]*|*:0*[89]*|*:)
    echo '"$2"' either contains a not-digit character, no characters, \
           or is an invalid octal constant - or perhaps a mix-and-match;;
([!-]*|?[!s]*|??[!:]*)
    echo '"$1"' is either empty, doesn\'t match '-s' in its first two characters, \
          or is more than two characters. Or perhaps a mix-and-match.;;
(*) echo there are no more possibilities other than the one you want.
    echo but you can get here a lot sooner, as demonstrated above.
esac

관련 정보