Не распечатывается дата в файл

В файл не распечатывается полная комбинация подстановок:

echo $D$M$Y00 > out.txt

Заданы

data = $(date +"%D-%M-%Y")
D = ${data:3:2}
M = ${data:0:2}
Y = ${data:12:4}

Дальше вывожу на печать в файл следующие команды:

echo $Y$M$D00 > sometext.txt

Но в итоговом файле получается 202105 вместо 2021052100.

Пробовал комбинацию

echo $Y$M $D 00

В таком случае все печатается как надо - 202105 21 00.


Ответы (1 шт):

Автор решения: aleksandr barakin

стандарт posix говорит по этому поводу:

The simplest form for parameter expansion is:

${parameter}

The value, if any, of parameter shall be substituted.

The parameter name or symbol can be enclosed in braces, which are optional except for positional parameters with more than one digit or when parameter is a name and is followed by a character that could be interpreted as part of the name. The matching closing brace shall be determined by counting brace levels, skipping over enclosed quoted strings, and command substitutions.

If the parameter is not enclosed in braces, and is a name, the expansion shall use the longest valid name (see XBD Name), whether or not the variable represented by that name exists.

перевод выделенного (это касается непосредственно вопроса):

если параметр не заключен в фигурные скобки, и он является именем, то для подстановки должно использоваться самое длинное из допустимых имён, вне зависимости от того, существует ли переменная с таким именем.


т.е., программа bash в приведённом примере действует в полном согласии с буквой и духом стандарта posix: строку $D00 пытается интерпретировать как отсылку к переменной с именем D00 (значение для которой в вашем скрипте, понятно, не установлено).

чтобы избежать подобных конфузов, имеет смысл не пренебрегать полной формой записи параметров и писать ${x}, а не сокращённо $x.

→ Ссылка