Как я могу убедиться, что соответствующая команда выполняется на основе аргументов, переданных в BASH? - PullRequest
0 голосов
/ 20 мая 2019

Я пишу свой первый bash-скрипт, который проведет некоторое визуальное тестирование с помощью призрака.Я сократил код, чтобы его было легче читать.

Что я пытаюсь написать:
- Команда BASH принимает аргумент - 1, 2 или 3. То есть regressiontest 1
- server будет присвоен передаваемый аргумент
- alias config будет присвоено wraith capture configs/capture-staging-1.yaml, wraith capture configs/capture-staging-2.yaml или wraith capture configs/capture-staging-3.yaml
- оператор echo записывается в текстовый файл.

Скрипт работает как положено.Единственная проблема:
Если запустить regressiontest 1, все хорошо, запускает wraith capture configs/capture-staging-1.yaml, как и ожидалось.

Я запускаю regressiontest 2, я ожидаю, что он запустит wraith capture configs/capture-staging-2.yaml, но, кажется, снова запускает wraith capture configs/capture-staging-1.yaml.

Кажется, он работает с использованием предыдущего файла конфигурации.Если я снова закрываю и открываю терминал, он работает как положено, но если я последовательно запускаю одну и ту же команду с другим аргументом, кажется, что она всегда запускает первую команду, которую я использую.

Что я делаю не так?
Я новичок в скриптах BASH и испытываю затруднения с поиском ответа на вопрос

function regressiontest {

    regressionfolder=~/path/to/folder

    cd $regressionfolder

    alias config

    if [ $# -eq 0 ]; then
        echo "No arguments provided - USAGE: regressiontest <server>"
        return 0
    else
        server=$1
    fi

    if [ $server != 1 ] && [ $server != 2 ] && [ $server != 3 ]; then
        echo "Visual Regression Testing argument invalid - USAGE: regressiontest <server>"
    return 0
    elif [ $server == 1 ]; then
        server="1"
        alias config='wraith capture configs/capture-staging-1.yaml'
    elif [ $server == 2 ]; then
        server="2"
        alias config='wraith capture configs/capture-staging-2.yaml'
    elif [ $server == 3 ]; then
        server="3"
        alias config='wraith capture configs/capture-staging-3.yaml'
    fi

    echo "https://website-staging-$server/" > data/server.txt

    config
}

Любая помощь будет принята с благодарностью.Спасибо, все мо

Ответы [ 2 ]

1 голос
/ 20 мая 2019

Вы думаете правильно, но делаете вещи сложнее, чем нужно. Ваша начальная часть скрипта в порядке, хотя я бы подтвердил, что cd успешен, например,

    regressionfolder=~/path/to/folder

    cd "$regressionfolder" || {
        printf "error: unable to change to %s\n" "$regressionfolder" >&2
        return 1
    }

( примечание: возврат 1 обычно указывает на ошибку и всегда двойная кавычка ваши переменные)

После проверки "$server" != 1 ... все, что вам нужно сделать, это установить псевдоним с $server в качестве числа. Никаких дополнительных if ... elif ... не требуется, например,

    if [ "$server" != 1 ] && [ "$server" != 2 ] && [ "$server" != 3 ]; then
        echo "Visual Regression Testing argument invalid - USAGE: regressiontest <server>"
        return 1
    fi

    alias config="wraith capture configs/capture-staging-$server.yaml"

    config
}

( примечание: всегда двойные кавычки переменные без [...])

Исключить alias

Нет необходимости в alias, вы можете просто запустить:

wraith capture configs/capture-staging-$server.yaml

В целом, вы можете сделать что-то похожее на:

function regressiontest {

    regressionfolder="$HOME/path/to/folder"

    cd "$regressionfolder" || {
        printf "error: unable to change to %s\n" "$regressionfolder" >&2
        return 1
    }

    if [ $# -eq 0 ]; then
        echo "No arguments provided - USAGE: regressiontest <server>"
        return 1
    else
        server=$1
    fi

    if [ "$server" != 1 ] && [ "$server" != 2 ] && [ "$server" != 3 ]; then
        printf "Visual Regression Testing argument invalid - "
        printf "USAGE: regressiontest <server>\n"
        return 1
    fi

    wraith capture "configs/capture-staging-$server.yaml"
}

( примечание: также использование "$HOME" вместо ~. Хотя ~ будет расширяться в командной строке, вы быстро столкнетесь с проблемами при использовании его в скриптах)

Использование оператора case

Более короткая, более сжатая версия вашей функции с использованием case ... esac, вероятно, будет немного лучше, например,

function regressiontest {

    regressionfolder="$HOME/path/to/folder"

    cd "$regressionfolder" || {
        printf "error: unable to change to %s\n" "$regressionfolder" >&2
        return 1
    }

    case "$server" in
        [123]   )   wraith capture "configs/capture-staging-$server.yaml";;
            *   )   printf "Visual Regression Testing argument invalid - "
                    printf "USAGE: regressiontest <server>\n"
                    return 1;;
    esac
}
1 голос
/ 20 мая 2019

Не думаю, что вы хотите объявлять псевдонимы, но сохраняете команды для последующего выполнения; просто удалите «псевдоним» из alias config='…' и в конце вызовите его через $config.

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