Почему вывод _$ _ выполняется на терминале?

Я выполнил следующую последовательность команд:

$ now=$(date)
$ echo _$now_
_
$ echo _ $now _
_ Mon Sep 22 09:53:44 IST 2014 _

Почему вывод _$now_ только _?

4 ответа

От man bash:

DEFINITIONS
       The following definitions are used throughout the rest of this document.
       blank  A space or tab.
       word   A sequence of characters considered as a single unit by the shell.
              Also known as a token.
       name   A word consisting only of alphanumeric characters and underscores, 
              and beginning with an alphabetic character or an underscore.  Also 
              referred to as an identifier.
...
PARAMETERS
       A parameter is an entity that stores values.  It can be a name, a number, 
       or one of the special characters listed below under Special Parameters.  
       A variable is a parameter denoted by a name.

Переменная может содержать только буквы, цифры и подчеркивания. Так что now_ является допустимым именем переменной и интерпретируется как таковой.

Вы можете разделить имя переменной по-разному:

_"$now"_
_${now}_
_$now"_"
_$now'_'

Или любая комбинация вышеперечисленного.

Так как _ является частью имени переменной в вашем echo _$now_

использование echo \_$now\_ вместо.

Также вы можете использовать это только в линейной команде: echo _$(date)_

Потерпи меня немного, это требует объяснения.

Во-первых, почему вывод _ $(date) _ является _ Mon Sep 22 03:30:34 MDT 2014 _? Потому что это буквально говорит echo: сначала вывести _, затем вывести $(date), а затем _ . Пробелы разделяют переменные для эха.

Сейчас попробуй echo _$(date), обратите внимание, нет места между _ а также $(date), В этом случае вывод будет _Mon Sep 22 03:32:40 MDT 2014, Что это делает? ты говоришь echo объединить подчеркивание с выводом $(date),

Попробуйте то же самое с _$PWD, который объединит ваш рабочий каталог с подчеркиванием. Сейчас попробуй echo $PWD_, Вывод будет пустым. Зачем? так как PWD_ является несуществующей переменной среды, и, как уже упоминали другие _ является допустимым символом для переменной среды, например $XDG_CURRENT_DESKTOP,

Так почему _$PWD_ даст _? Потому что вы говорите echo соединять _ с выводом несуществующей переменной среды. Так _ печатается, но $PWD_ вывод пуст, так что вы буквально видите _ соединены с этим пустым выводом.

_$now_ 

интерпретируется как

_${now_}

которая в вашем случае, очевидно, является строкой concat '_' и ''. Используйте поэтому

_${now}_

вместо. Гораздо понятнее читать.

Другие вопросы по тегам