Символ $
используется для обозначения того, что расширение параметра должно выполняться на следующем. Поэтому, если оболочка читает
abc
на нем будет анализироваться как команда, и оболочка будет пытаться выполнить эту команду.
Если оболочка видит
$abc
он будет выполнять parameter expansion
по тексту abc
и эффективно заменить значение аЬс на месте.
${abc}
также будет выполнять расширение параметра. Использование скобок становится существенным, когда у вас есть такие выражения, как это:
${abc}_sometext
в сравнении
$abc_sometext
В 1-ом случае оболочка будет выполнять расширение параметров на abc
. Во втором случае он будет выполнять расширение параметра на abc_sometext
$(
сообщает оболочке выполнить что-то в фигурных скобках и выполнить command substitution
.В этом контексте $
не используется для parameter expansion
. Таким образом, если оболочка читает следующее:
$(abc)
оболочка будет выполнять abc
и выход из него будет на месте замещенной и оболочка будет пытаться выполнить эту строку.
(
просто группирует команды и выполняет их в подоболочке. Так
(abc)
выполнит abc
, но в отличие от $(abc)
он не будет пытаться выполнить все, что выход команды есть. Например:
$ $(which ls)
Desktop Documents Downloads Mail Manjaro Music Pictures Public Templates Videos bin code tmp
$ (which ls)
/usr/bin/ls
$
посмотри на это: http://www.tldp.org/LDP/abs/html/varsubn.html – ti7
И вы пропустили несколько: '(($ а)) ',' $ ((abc)) 'и' $ (($ abc)) 'могут иметь некоторый смысл, хотя и очень полезны. Попробуйте: 'abc = 1 + 1; (($ А)); ((ABC)); echo $ ((abc)); echo $ (($ abc)) '. –