Posso colocar intervalos em parâmetros? [duplicado]

2

Eu tenho este código:

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

0-9 não funciona para mim. O que eu realmente quero é digitar, por exemplo, -x 3 (ou qualquer número).

    
por user150802 09.01.2016 / 18:21

3 respostas

8

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

-ge: greater-than-or-equal

-le: less-than-or-equal

    
por 09.01.2016 / 18:32
6

Isso é possível, mas você precisa usar uma classe de caractere ( [0-9] ). Por exemplo:

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

No entanto, o que foi mencionado acima é válido apenas para $2 , que consiste em um único dígito. Se você quiser que $2 consista em um ou mais dígitos, use:

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

Nas versões mais recentes do bash, você também pode usar expressões regulares:

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

O ^ corresponde ao início da string e $ ao final. O + significa "0 ou mais". Portanto, ^[0-9]*$ só será verdadeiro se a cadeia consistir em apenas um ou mais dígitos desde o início até o final.

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

... se você equilibrar a comparação, às vezes você pode encurtar o teste.

Eu prefiro case embora:

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

Basicamente, a ideia é excluir qualquer correspondência para um não dígito. Por exemplo:

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

É muito mais simples com case porque você tem várias ramificações.

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
    
por 09.01.2016 / 19:47