Назад | Перейти на главную страницу

Bash для циклов и имен хостов и как их сгенерировать

Почему это не работает?

NODE_ROOT=node0
INFRA_DOMAIN=example.com
for host in $NODE_ROOT{1..3}.$INFRA_DOMAIN; do echo $host; done

Я ожидаю:

node01.example.com
node02.example.com
node03.example.com

Однако я получаю:

.example.com
.example.com
.example.com

Как мне это сделать правильно?

Проблема с вашим скриптом в том, что Bash не может интерпретировать $NODE_ROOT{1..3} правильно. Чтобы помочь, вам нужно заключить переменную в кавычки, ", что в любом случае считается «хорошей практикой». Вы также можете использовать "${VARIABLE}"-type синтаксис также поможет Bash.

Например,

NODE_ROOT=node0
INFRA_DOMAIN=example.com
for host in "$NODE_ROOT"{1..3}."$INFRA_DOMAIN"; do echo $host; done

или

for host in "${NODE_ROOT}"{1..3}."$INFRA_DOMAIN"; do echo $host; done

Дальнейшее чтение:

Заменить

$NODE_ROOT{1..3}.$INFRA_DOMAIN

по

${NODE_ROOT}{1..3}.$INFRA_DOMAIN

Вы можете просто изменить свой скрипт, чтобы он читал:

NODE_ROOT=node0
INFRA_DOMAIN=example.com
for n in {1..3}; do echo ${NODE_ROOT}${n}.${INFRA_DOMAIN}; done