Как я могу проверить что-то вроде формата автомобильного номера?

Вот более простой скрипт для импорта псевдонимов bash в fish. Создайте файл fish_import_bash_aliases.fishв папке ~/.config/fish/functionsсо следующим содержимым.

function fish_import_bash_aliases \
    --description 'import bash aliases to.fish function files.'
    for a in (cat ~/.bash_aliases  | grep "^alias")
        set aname (echo $a | sed 's/alias \(.*\)=\(\'\|\"\).*/\1/')
        set command (echo $a | sed 's/alias \(.*\)=\(\'\|\"\)\(.*\)\2/\3/')
        if test -f ~/.config/fish/functions/$aname.fish
            echo "Overwriting alias $aname as $command"
        else
            echo "Creating alias $aname as $command"
        end
        alias $aname $command
        funcsave $aname
    end
end

После того, как файл скрипта будет готов, запустите fish_import_bash_aliasesв оболочке fish, которая создаст скрипт функции fish для каждого псевдонима bash в ~/.config/fish/functions.

-3
05.04.2021, 19:29
3 ответа

Я предполагаю, что 0в ваших примерах означает «любая одиночная цифра», а XYZ— «любая строка из трех букв верхнего -регистра». В приведенном ниже коде также предполагается локаль POSIX.

#!/bin/sh

for string do
        case $string in
                ([0-9][0-9][0-9][0-9]-[A-Z][A-Z][A-Z])
                        printf '"%s" looks like a number plate\n' "$string"
                        ;;
                ([0-9][0-9][0-9]-[0-9][0-9][0-9][0-9])
                        printf '"%s" looks like a Zip-code\n' "$string"
                        ;;
                (*)
                        printf 'Cannot determine what "%s" is\n' "$string"
        esac
done

При этом используются шаблоны подстановки для сопоставления каждой из заданных строк и определения ее типа или невозможности определения ее типа. Строки задаются в командной строке скрипта.

Тестирование:

$./script 1234-ABC 234-2345 AAA-BB
"1234-ABC" looks like a number plate
"234-2345" looks like a Zip-code
Cannot determine what "AAA-BB" is

Использование регулярных выражений в bashвместо:

#!/bin/bash

for string do
        if [[ $string =~ ^[0-9]{4}-[A-Z]{3}$ ]]; then
                printf '"%s" looks like a number plate\n' "$string"
        elif [[ $string =~ ^[0-9]{3}-[0-9]{4}$ ]]; then
                printf '"%s" looks like a Zip-code\n' "$string"
        else
                printf 'Cannot determine what "%s" is\n' "$string"
        fi
done

(Вывод такой же, как и выше, с теми же аргументами командной строки.)

2
28.04.2021, 22:54

Вы можете использовать регулярное выражение в сценарии bash. например:

#!/bin/bash

car_plate="0000-0000"
if [[ $car_plate =~ ^[0-9-]+$ ]]; then
    echo "standard"
elif [[ $car_plate =~ ^[0-9]+-[a-zA-Z]+$ ]]; then
    echo "japanese"
fi
-3
28.04.2021, 22:54

Я сделал сценарий. Надеюсь, я вас правильно понял

#! /bin/bash

for plate do
[[ $plate =~ ^[0-9]{3}-[0-9]{4}$ ]] && echo "$plate : Japanese Plate" && continue
[[ $plate =~ ^[0-9]{4}-[A-Z]{3}$ ]] && echo "$plate : Normal Plate" && continue
echo "$plate : INVALID INPUT" 
done

Очень просто и воспроизводимо.

Я хотел бы заявить, что я УЖАСНО кодирую, bash не исключение. Воспринял это как вызов, чтобы попытаться немного улучшить свои навыки.

НЕСКОЛЬКО КЛЕММ ВЫХОДОВ:

INPUT:    bash testfindnew.sh 000-1234 0000-XYZ 000-00000 0000-XYZZ
OUTPUT:   000-1234 : Japanese Plate
          0000-XYZ : Normal Plate
          000-00000 : INVALID INPUT
          0000-XYZZ : INVALID INPUT
 
0
28.04.2021, 22:54

Теги

Похожие вопросы