Как инвертировать шаблон "регулярное выражение" для символа где-нибудь в строке с помощью оператора bash case - PullRequest
0 голосов
/ 07 мая 2020

Вот сценарий для проверки моих шаблонов

Я знаю, что этот синтаксис /tmp/** не bash, это просто настраиваемые параметры, которые будут оцениваться позже и поэтому заключены в одинарные кавычки, чтобы предотвратить bash расширение.

Каждый раз, когда последний тест терпит неудачу и интерпретируется как file, а не custom Я не могу перевести это if string contains wildcard character somewhere in the string AND if not ending with * OR /, это file

    #! /usr/bin/env bash

    #set -f # => nullglob 
    shopt -s extglob

    testcheck_params=()
    testcheck_vals=()

    testcheck_params+=('/tmp/file')
    testcheck_vals+=("file")

    testcheck_params+=('/tmp/file.tmp')
    testcheck_vals+=("file")

    testcheck_params+=('/tmp/folder/')
    testcheck_vals+=("folder")

    testcheck_params+=('/tmp/folder/*')
    testcheck_vals+=("all files & folders")

    testcheck_params+=('/tmp/folder/**')
    testcheck_vals+=("all files no folder")

    testcheck_params+=('/tmp/folder/*/')
    testcheck_vals+=("all folders no file")

    testcheck_params+=('/tmp/folder/**/*')
    testcheck_vals+=("all files recursive")

    testcheck_params+=('/tmp/folder/f*')
    testcheck_vals+=("custom")

    testcheck_params+=('/tmp/folder/*d*')
    testcheck_vals+=("custom")

 ## This one is failing interpreted as file and not custom
    testcheck_params+=('/tmp/folder/*.tmp')
    testcheck_vals+=("custom")

    for ((i=0 ; i<${#testcheck_params[@]}; i++))
    do

        echo "[ param: ${testcheck_params[$i]} ]"
        testcheck_param="${testcheck_params[$i]}"

        #case "$1" in
        case "$testcheck_param" in
            *[!\*]*[!/\*$])                     #*[!/\*$]|
                testcheck_val="file"
                echo "file"
            ;;
            *[!/][!\*][/$])             # => "/tmp/"
                testcheck_val="folder"
                echo  "folder"
            ;;
            *[!/\*][/][\*$])                    # => "/tmp/*"
                testcheck_val="all files & folders"
                echo "all files & folders"
            ;;
            *[!/\*][/][\*][\*$])                    # => "/tmp/**"
                testcheck_val="all files no folder"
                echo "all files no folder"
            ;;
            *[/][\*][/$])               # => "/tmp/*/"
                testcheck_val="all folders no file"
                echo "all folders no file"
            ;;
            *[/][\*][\*][/][\*$])               # => "/tmp/**/*"
                testcheck_val="all files recursive"
                echo "all files recursive"
            ;;
            *)
                testcheck_val="custom"
                echo "custom"
            ;;

        esac

    if [[ "${testcheck_vals[$i]}" == "${testcheck_val}" ]] ; then
        echo "TEST = PASSED"
    else
        echo "TEST = FAILED"
    fi

    done

    exit

Мне нужно сделать это с помощью оператора case, потому что он будет интегрирован в другой сценарий, основанный на нем.

Я прочитал несколько примеров по stackoverflow (но там нет примера, который явно отрицает символ) и Bash Справочное руководство но есть кое-что, что я не могу понять.

С уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...