Сделайте так, чтобы синтаксис параметра командной строки совпадал с именем папки, если она выглядит так - PullRequest
1 голос
/ 10 июня 2019

Я довольно новичок в написании сценариев bash, поэтому я не знаю, что делать с sed, awk или любым другим инструментом сценариев bash.Моя проблема: я должен запустить скрипт sh, который принимает один параметр.Из-за некоторых специфических характеристик мы не можем предложить какие-либо входные данные командной строки для проверки или изменения любой опечатки.Я хотел бы, чтобы слово, записанное в параметре, было исправлено путем сравнения его с именами подпапок, находящихся в точной папке.И поэтому имя подпапки с написанием, наиболее похожим на параметр, приходит на смену начальному параметру.Короче говоря, если параметр хорошо написан и поэтому выглядит как 100% как имя подпапки, тогда хорошо, в противном случае выполните тест на подобие.Вот фактический скрипт bash:

#!/bin/bash

set -e
set -o pipefail

if [ -z "${STACK_NAME}" ]; then
    echo "Error: Missing some parameters"
    exit 1
fi

ansible-playbook -vv \
    -e 'ansible_python_interpreter="/usr/bin/env python"' \
    -i inventories/${STACK_NAME} 

Папка с подпапками выглядит следующим образом:

Запасы (основная папка)
- docker-stg
- es-мониторинг
- производство
- разработка
- проверка

Поэтому, если я введу команду для запуска сценария sh:

sh script.sh monitoring

Иликоманда:

sh script.sh monit

или:

sh script.sh esmonit

В каждом случае сценарий должен принимать параметр и фактически использовать "es-мониторинг" Спасибо за вашеПомогите.С наилучшими пожеланиями

1 Ответ

2 голосов
/ 10 июня 2019

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

#!/bin/bash

if [ $# != 1 ]
then
    echo "ERROR, missing argument."
    echo "       Usage: $0 [arg]"
    exit 1
else
    arg=$1
fi

if [ ! -d *$arg* ]
then
    echo "ERROR: no directory includes that value."
    exit 1
else
    directory=$(find . -type d -name "*$arg*" -prune -print)
    echo "Found a directory: $directory"

    ansible-playbook -vv \
    -e 'ansible_python_interpreter="/usr/bin/env python"' \
    -i inventories/$directory
fi

Подробности:

  • оператор -d test проверяет, существует ли каталог с этим именем(здесь $ arg )
  • если мне нужно, это имя.Но если я использую ls, он также выведет список файлов, которые соответствуют $ arg .Поэтому я использую find с -type d для перечисления только каталогов.
  • -prune используется, чтобы гарантировать, что поиск не будет повторяться в подкаталогах.

Если может присутствовать несколько каталогов, эта версия будет обрабатывать каждую по очереди в цикле:

#!/bin/bash

if [ $# != 1 ]
then
    echo "ERROR, missing argument."
    echo "       Usage: $0 [arg]"
    exit 1
else
    arg=$1
fi

directories=$(find . -type d -name "*$arg*" -prune -print)
if [ -z $directories ]
then
    count=0
else
    count=$(echo $directories | wc -l)
fi

if [ $count == 0 ]
then
    echo "ERROR: no directory includes that value."
    exit 1
else
    echo "Found 1 (or more) directory."

    for DIR in $directories
    do
        #echo $DIR

        ansible-playbook -vv \
        -e 'ansible_python_interpreter="/usr/bin/env python"' \
        -i inventories/$directory
    done
fi
  • Проверка -z $directories позволяет избежать возврата wc -l 1 напустая переменная.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...