: и := внутри расширения параметра bash

Пытаюсь понять dockerfile, написанный на bash. Что такое: для?

: ${WORDPRESS_DB_USER:=root}

И :=?

Я помещаю больше кода из скрипта для справки:

#!/bin/bash
set -e

if [ -n "$MYSQL_PORT_3306_TCP" ]; then
    if [ -z "$WORDPRESS_DB_HOST" ]; then
        WORDPRESS_DB_HOST='mysql'
    else
        echo >&2 'warning: both WORDPRESS_DB_HOST and MYSQL_PORT_3306_TCP found'
        echo >&2 "  Connecting to WORDPRESS_DB_HOST ($WORDPRESS_DB_HOST)"
        echo >&2 '  instead of the linked mysql container'
    fi
fi

if [ -z "$WORDPRESS_DB_HOST" ]; then
    echo >&2 'error: missing WORDPRESS_DB_HOST and MYSQL_PORT_3306_TCP environment variables'
    echo >&2 '  Did you forget to --link some_mysql_container:mysql or set an external db'
    echo >&2 '  with -e WORDPRESS_DB_HOST=hostname:port?'
    exit 1
fi

# if we're linked to MySQL, and we're using the root user, and our linked
# container has a default "root" password set up and passed through... :)
: ${WORDPRESS_DB_USER:=root}
if [ "$WORDPRESS_DB_USER" = 'root' ]; then
    : ${WORDPRESS_DB_PASSWORD:=$MYSQL_ENV_MYSQL_ROOT_PASSWORD}
fi
: ${WORDPRESS_DB_NAME:=wordpress}

person user2670996    schedule 20.05.2015    source источник


Ответы (1)


: — это просто команда, которая ничего не делает. Однако аргументы команды по-прежнему оцениваются.

${WORDPRESS_DB_NAME:=wordpress} — это расширение параметра, которое проверяет, не установлено ли значение WORDPRESS_DB_NAME или имеет ли значение пустую строку. Если одно из них верно, параметру присваивается значение wordpress. Результатом расширения является (возможно, вновь присвоенное) значение WORDPRESS_DB_NAME.

Вместе они образуют общую идиому оболочки для установки значения переменной, если она еще не имеет (ненулевого) значения.

Эквивалент Python (не DRY) может быть

try:
    if not WORDPRESS_DB_NAME:
        WORDPRESS_DB_NAME = "wordpress"
except NameError:
    WORDPRESS_DB_NAME = "wordpress"
person chepner    schedule 20.05.2015