Баш - проверить, если данный аргумент выходит

Баш - проверить, если данный аргумент выходит

24.01.2020 04:52:28 Просмотров 28 Источник

У меня есть отдельный скрипт оболочки, который запускает мою среду docker-compose в режиме прикрепления или отсоединения, если я передаю -dили --detach. Это прекрасно работает, когда я передаю этот аргумент ( ./run-env.sh -d) но это не так, когда я запускаю свой сценарий без какой-либо опции ( ./run-env, просто получая пустой вывод и docker-compose не запускается), где может быть проблема?

#!/usr/bin/env bash

for arg in "$@"; do
    if [ "$arg" = '-d'  ] || [ "$arg" = '--detach'  ]
    then
         docker-compose  -f docker-compose.local-environment.yml up --build -V --detach
    else
         docker-compose  -f docker-compose.local-environment.yml up --build -V --abort-on-container-exit
    fi
done
У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/59897820/bash-check-if-given-argument-exits#comment105923307_59897820
Спасибо за навигацию.

Ответы - Баш - проверить, если данный аргумент выходит / Bash - Check If given argument exits

Является ответом!
Zelnes

24.01.2020 05:01:00

Когда вы не даете аргумента, вы даже не входите forцикл for, поэтому ничего не происходит.

#!/usr/bin/env bash

# By default, use '--abort-on-container-exit' option
abort_or_detach="--abort-on-container-exit"

# Search for a parameter asking to run in detached mode
for arg in "$@"; do
    if [ "$arg" = '-d'  ] || [ "$arg" = '--detach'  ]
    then
         abort_or_detach="--detach"
    fi
done

# Run with the correct option
docker-compose -f docker-compose.local-environment.yml up --build -V $abort_or_detach

Здесь, в этом скрипте, вы вызываете один раз docker-compose, и вы можете легко управлять опциями с помощью цикла for

Кроме того, с первой попытки вы запускаете docker-composeстолько раз, сколько у вас есть различных параметров. Вот вы их обработаете, а потом сделаете одиночный запуск

William Pursell

24.01.2020 05:06:01

for arg in "$@"перебирает аргументы. Когда вы не передаете никаких аргументов, он повторяется ноль раз. Вместо этого попробуйте что-нибудь вроде:

extra=--abort-on-container-exit
for arg; do
    case "$arg" in
    -d|--detach) extra=--detach
    esac
done

docker-compose  -f docker-compose.local-environment.yml up --build -V $extra

Обратите внимание , что это один из тех случаев, когда вы не хотите ставить кавычки вокруг $extra, потому что если extra-это пустая строка, вы не хотите ничего передавать docker-compose. (Здесь значение по умолчанию гарантирует, что она не пуста, но это довольно распространенный шаблон, и есть случаи, когда это будет пустая строка.)

https://stackoverflow.com/questions/59897820/bash-check-if-given-argument-exits/59898049#comment105924877_59898049
Чтобы избежать расширения без кавычек, можно также сохранить параметры в массиве. Пустой массив расширяется, даже в кавычках, до нуля. Или вы можете использовать ${extra:+"$extra"}.
Закрыть X