В оболочке рыбы, как проверить, является ли переменная числом? - PullRequest
0 голосов
/ 14 октября 2018

Как проверить, является ли переменная числом в оболочке рыбы?Ищете простой способ сделать это.

Ответы [ 4 ]

0 голосов
/ 16 июня 2019

Моя попытка:

math "0+$argv[2]" 2>/dev/null
if test $status -ne 0
    echo "argv 2 is not numeric"
else
    echo "argv was numeric"
end
0 голосов
/ 14 октября 2018

Проверьте, есть ли в переменной не цифра:

if not string match --quiet --regex '\D' $var; ...
# or
if string match --quiet --regex --invert '\D' $var; ...
0 голосов
/ 14 октября 2018

Я думаю, что рыба черпает вдохновение из Tcl: строковые подкоманды очень похожи: fish против Tcl .

Одна хорошая подкоманда из Tcl - string is, где вы можете сказать

if {[string is integer $num]} {
    puts "$num is an integer"
}

Я взломал функцию для выставления string is [class] [string] в рыбе:

function string  --wraps=string
    if set -q argv[1]; and [ $argv[1] = "is" ]
        if not set -q argv[2]
            echo "error: usage..." >&2
            return
        end
        set -l pattern
        switch $argv[2]
            case int integer
                set pattern '^[+-]?\d+$'
            case hex hexadecimal xdigit
                set pattern '^[[:xdigit:]]+$'
            case oct octal
                set pattern '^[0-7]+$'
            case bin binary
                set pattern '^[01]+$'
            case float double
                set pattern '^[+-]?(?:\d+(\.\d+)?|\.\d+)$'
            case alpha
                set pattern '^[[:alpha:]]+$'
            case alnum
                set pattern '^[[:alnum:]]+$'
            case '*'
                echo "unknown class..." >&2
                return
        end
        set argv match --quiet --regex -- $pattern $argv[3]
    end
    builtin string $argv
end
0 голосов
/ 14 октября 2018

Одним из возможных решений является использование string match следующим образом:

set num 123
if string match -qr '^[0-9]+$' $num; echo 'it is a number!'; end

Если num не является числом, ничего не повторяется.

Вот краткий обзор string match из рыбыдокументация оболочки (https://fishshell.com/docs/current/commands.html#string):

string match [(-a | --all)] [((-e | --entire)] [(-i | --ignore-case)] [(-r | --regex)]
         [(-n | --index)] [(-q | --quiet)] [(-v | --invert)] PATTERN [STRING...]
...