if then statment и для каждого скрипта bash

Можете ли вы попробовать использовать следующий формат для создания:

 docker run -it --mount type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH> --mount type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH> -p host_port:container_port --name myservice <IMAGE>

Редактировать:Команда создания была отредактирована

Вышеизложенное сработало для меня:

docker run -ti --mount type=volume,src=cust_vol2,dst=/cust_vol2 --mount type=volume,src=cust_vol1,dst=/cust_vol1  -p 8024:8024  --name mycontainer centos

$docker inspect mycontainer
"Mounts": [
            {
                "Type": "volume",
                "Source": "cust_vol2",
                "Target": "/cust_vol2"
            },
            {
                "Type": "volume",
                "Source": "cust_vol1",
                "Target": "/cust_vol1"
            }
        ]

и предоставить подробный вывод, если это возможно.

0
28.08.2020, 19:17
3 ответа

Я думаю, вы хотите проверить бла внутри цикла for. Нет необходимости в переменной tmpcheck. Вместо этого вы можете использовать $restartrsyslogдля перезапуска rsyslog только один раз :

.
files=(
    '/etc/rsyslog.conf'
    '/etc/rsyslog.d/remote.conf'
    '/etc/rsyslog.d/01-remote.conf'
)

restartrsyslog=

for f in "${files[@]}";do
    if grep -q blah "$f"; then
        echo -e "Removing blah from $f"
        sed -i "/blah/d" "$f"
        restartrsyslog=yes
    else
        echo -e "Nothing to do, blah has been removed from $f"
    fi
done

if [[ -n $restartrsyslog ]] ; then
    echo -e "Restarting rsyslog service"
    systemctl restart rsyslog.service
fi
1
18.03.2021, 23:09

Ваша переменная tmpcheckустанавливается на команду, а не на результат этой команды, она никогда не будет равна 1, поэтому выражение всегда будет оцениваться как истинное. Вы должны использовать конструкцию $(... )для замены вывода команд. Вам также не нужно зацикливаться на файлах, но если вы это сделаете, вам не следует использовать ${files[*]}, а вместо этого используйте ${files[@]}. Кроме того, нет необходимости catпередавать один файл и передавать в grep, поскольку grepможет читать файлы, и нет необходимости передавать grepв wc -l, поскольку grepимеет параметр -c. для подсчета результатов. Наконец, почему вы проверяете, что tmpcheckне равно 1? Что, если оно равно 2 или больше?

Вам это подходит?

#!/bin/bash
files=(
    '/etc/rsyslog.conf'
    '/etc/rsyslog.d/remote.conf'
    '/etc/rsyslog.d/01-remote.conf'
)

tmpcheck=$(cat "${files[@]}" | grep -c blah)

if (($tmpcheck>=1)); then
    for f in "${files[@]}";do
        echo -e "Removing blah from $f"
        sed -i "/blah/d" "$f"
    done
    echo -e "Restarting rsyslog service"
    systemctl restart rsyslog.service
else
    echo -e "Nothing to do, blah has been removed from $f"
fi
0
18.03.2021, 23:09

Основная проблема в вашем коде (назначениеtmpcheck)было указано в других ответах. Здесь немного другой подход, предполагающий, что распечатка имен модифицированных/немодифицированных файлов не является обязательной:

if grep -q -- blah "${files[@]}"
then
    sed -i -e '/blah/d' -- "${files[@]}"
    systemctl restart rsyslog.service
else
    printf '%s\n' 'Nothing to do'
fi

Основные идеи здесь:

  • непосредственно использовать(grep)статус выхода команды в составных командах ifвместо того, чтобы сохранять ее вывод и тестировать его позже, если это не необходимо;
  • вызов утилит в цикле менее эффективен; лучше вызывать их с несколькими файлами в качестве аргументов, когда это возможно.

Кроме того, пока это не проблемы в коде, который вы показываете:

  • добавление маркера конца -из -опций(--)защищает от необычных имен файлов;
  • printfбезопаснее , чем echo, особенно при печати результатов расширений.
1
18.03.2021, 23:09

Теги

Похожие вопросы