2015-08-12 2 views
2

Я новичок в сценариях Unix Shell, и я немного смущен тем, в каких случаях я должен использовать эти типы скобок. Предположим, что abc - это переменная, состоящая из строки. Может ли кто-нибудь дать мне примеры того, как использовать эти скобки и когда я должен их использовать?Unix Shell - Понимание использования скобок для переменных

abc $abc ${abc} $(abc) ($abc)

+1

посмотри на это: http://www.tldp.org/LDP/abs/html/varsubn.html – ti7

+0

И вы пропустили несколько: '(($ а)) ',' $ ((abc)) 'и' $ (($ abc)) 'могут иметь некоторый смысл, хотя и очень полезны. Попробуйте: 'abc = 1 + 1; (($ А)); ((ABC)); echo $ ((abc)); echo $ (($ abc)) '. –

ответ

4

Это довольно грубый, но должен быть хороший старт:

abc - голое слово \ строка, которая может быть имя переменной: abc=123

$abc - ссылка на переменную abc

${abc} - строка ссылки сейф переменная file_${abc}_name.txt

$(abc) - запустить команду abc и использовать это стандартный вывод вместо $(abc)

($abc) - запустить команду, хранящуюся $abc в субоболочке

Предполагая, что вы приведены в bash, прочитанные the docs on variables и command substitution и parameter substitution.

+0

'($ abc)' - в подоболочке, запустите команду, хранящуюся в переменной 'abc'. IO по стандартным каналам. Я не знаю, что вы подразумеваете под «string safe» - скобки служат для устранения неоднозначности переменной из следующего текста «_name» –

+0

@glennjackman hmm Фактически я получаю синтаксическую ошибку ... 'hi = 'echo hi'; echo ($ hi) ' –

+0

@glennjackman Я имею в виду сейф, потому что« file_ $ abc_name.txt »попытается найти переменную с именем' $ abc_name', а не '$ abc' –

3

Символ $ используется для обозначения того, что расширение параметра должно выполняться на следующем. Поэтому, если оболочка читает

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 
$