Баш - проверить, если данный аргумент выходит
У меня есть отдельный скрипт оболочки, который запускает мою среду 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


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

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
столько раз, сколько у вас есть различных параметров. Вот вы их обработаете, а потом сделаете одиночный запуск

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. (Здесь значение по умолчанию гарантирует, что она не пуста, но это довольно распространенный шаблон, и есть случаи, когда это будет пустая строка.)

${extra:+"$extra"}
.