Почему не $ foo = * приводит к ошибке?

Почему вы выполняете команды с веб-страницы dropbox?

Вам лучше использовать инструкции по установке из arch linux wiki: https://wiki.archlinux.org/index.php/dropbox#Installation

3
30.11.2018, 18:18
2 ответа

Расширение имени пути не происходит во время назначения переменной. Вот выдержка из справочной страницы bash:

If value is not given, the variable is assigned the null string. All values undergo tilde expansion, parameter and variable expansion, command substitution, arithmetic expansion, and quote removal (see EXPANSION below). If the variable has its integer attribute set, then value is evaluated as an arithmetic expression even if the $((...)) expansion is not used (see Arithmetic Expansion below). Word splitting is not performed, with the exception of "$@" as explained below under Special Parameters. Pathname expansion is not performed.

Когда вы выполняете присваивание foo=*, переменная foo будет содержать литерал *. Когда вы позже используете переменную (без кавычек ), параметр сначала расширяется до литерала *, а затем происходит расширение имени пути. Вы можете убедиться, что он содержит литерал *, процитировав расширение параметра:

$ foo=*
$ echo "$foo"
*

В bash есть некоторые исключения из этого правила, например, при присвоении массива:

$ foo=(*)

В приведенном выше примере раскрытие пути происходит немедленно, и массив содержит список файлов, соответствующих шаблону.

3
27.01.2020, 21:21

Если подстановочный знак не может превратиться в глобус оболочкой, он обрабатывается буквально:

$ cd scratch
$ rm *
$ foo=*
$ echo $foo
*
$ echo "$foo"
*
$ touch file
$ echo $foo
file
$ echo "$foo"
*
0
27.01.2020, 21:21

Теги

Похожие вопросы