Как проверить динамическую переменную подстроки c в условном выражении в шеллскрипте? - PullRequest
0 голосов
/ 29 апреля 2020

Этот код проверяет, соответствуют ли последние 4 символа переменной $ 1 строке в переменной $ 2, ожидаемой точкой.

    if [ "${1: -4}" == ".$2" ]; then
        return 0
    else
        return 1
    fi

// true with $1 = example.doc and $2 = doc
// false with $1 = example.docx and $2 = doc

как заменить жестко закодированный 4 следующей вычисленной переменной $ CHECKER_EXTENSION как это?

    LENGTH_EXTENSION=${#2}
    CHECKER_EXTENSION=$(( LENGTH_EXTENSION + 1 ))

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 29 апреля 2020

Вам не нужно удалять первые символы из $1, поскольку bash [[ ]] может выполнять сопоставление с шаблоном в стиле подстановки:

if [[ "$1" = *".$2" ]]; then
    ...

Обратите внимание, что вы должен использовать [[ ]], а не [ ], чтобы получить сопоставление с образцом, а не простое тестирование на равенство строк. Кроме того, наличие * без кавычек, но .$2 в кавычках означает, что * будет рассматриваться как подстановочный знак, но $2 будет совпадать буквально, даже если он содержит подстановочные знаки sh символов. Если вы хотите, чтобы $2 также обрабатывался как шаблон (например, вы можете использовать [Jj][Pp][Gg] для сопоставления "jpg" и "JPG" и комбинаций), не используйте кавычки:

if [[ "$1" = *.$2 ]]; then

О, и кавычки вокруг $1 не имеют значения в этой конкретной ситуации; но я склонен заключать в кавычки переменные, если нет конкретной причины c.

2 голосов
/ 29 апреля 2020

Смещение интерпретируется как арифметическое c выражение (тот же синтаксис, что и внутри $(( ... ))), поэтому вы можете написать:

    if [ "${1: -CHECKER_EXTENSION}" == ".$2" ]; then

Вы можете даже исключить переменную CHECKER_EXTENSION и написать:

    if [ "${1: -(${#2} + 1)}" == ".$2" ]; then
1 голос
/ 29 апреля 2020

Вы можете использовать это так:

myfunc() {
   local num_ext=$(( ${#2} + 1 ))

   [[ "${1: -$num_ext}" = ".$2" ]]
}
...