Как я выхожу из подстановочного знака/символа звездочки в ударе?

например.

me$ FOO="BAR * BAR"
me$ echo $FOO
BAR file1 file2 file3 file4 BAR

и использование "\" символ ESC:

me$ FOO="BAR \* BAR"
me$ echo $FOO
BAR \* BAR

Я, очевидно, делаю что-то глупое.

Как я получаю вывод "ПАНЕЛЬ * ПАНЕЛЬ"?

128
задан Benjamin W. 7 November 2019 в 22:04
поделиться

5 ответов

Заключение в кавычки при установке $FOO недостаточно. Необходимо заключить ссылку на переменную в кавычки также:

me$ FOO="BAR * BAR"
me$ echo "$FOO"
BAR * BAR
128
ответ дан 24 November 2019 в 00:37
поделиться

в КОРОТКОМ ОТВЕТЕ

Как другие было сказано - необходимо всегда заключать переменные в кавычки для предотвращения странного поведения. Так использование эхо "$foo" во вместо всего $foo эха .

ДЛИННЫЙ ОТВЕТ

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

я вижу, где Ваш беспорядок входит потому что после выполнения первого примера, Вы, вероятно, думали себе, что оболочка, очевидно, делает:

  1. расширение Параметра
  2. расширение Имени файла

Так от Вашего первого примера:

me$ FOO="BAR * BAR"
me$ echo $FOO

После того, как расширение параметра эквивалентно:

me$ echo BAR * BAR

И после того, как расширение имени файла эквивалентно:

me$ echo BAR file1 file2 file3 file4 BAR

И если Вы просто тип echo BAR * BAR в командную строку Вы будете видеть, что они эквивалентны.

, Таким образом, Вы, вероятно, думали себе, "если я выхожу *, я могу предотвратить расширение имени файла"

Так от Вашего второго примера:

me$ FOO="BAR \* BAR"
me$ echo $FOO

После того, как расширение параметра должно быть эквивалентно:

me$ echo BAR \* BAR

И после того, как расширение имени файла должно быть эквивалентно:

me$ echo BAR \* BAR

И при попытке ввести "ПАНЕЛЬ эха \* ПАНЕЛЬ" непосредственно в командную строку, она действительно распечатает "ПАНЕЛЬ * ПАНЕЛЬ", потому что расширение имени файла предотвращено Escape.

Итак, почему использование $foo не работало?

Это - потому что существует третье расширение, которое происходит - Удаление Кавычки. От удара ручное удаление кавычки:

После предыдущих расширений, все неупомянутые случаи символов †˜\’, †˜'’, и †˜ "’, который не следовал из одного из вышеупомянутых расширений, удалены.

Поэтому то, что происходит, - когда Вы вводите команду непосредственно в командную строку, символ ESC не является результатом предыдущего расширения, таким образом, Bash удаляет его прежде, чем отправить, это к команде эха, но в 2-м примере, "\*" был результат предыдущего расширения Параметра, таким образом, это НЕ удалено. В результате эхо получает "\*", и это - то, что оно печатает.

Примечание различие между первым примером - "*" не включено в символы, которые будут удалены Удалением Кавычки.

я надеюсь, что это имеет смысл. В конце заключение в том же - просто используют кавычки. Я просто думал, что объясню, почему выход, который логически должен работать, если только Параметр и расширение Имени файла приведены в действие, не работал.

Для полного объяснения расширений Bash, обратитесь к:

http://www.gnu.org/software/bash/manual/bashref.html#Shell-Expansions

97
ответ дан 24 November 2019 в 00:37
поделиться
echo "$FOO"
3
ответ дан 24 November 2019 в 00:37
поделиться
FOO='BAR * BAR'
echo "$FOO"
4
ответ дан 24 November 2019 в 00:37
поделиться

Это может стоить выработать привычку использования printf скорее затем echo на командной строке.

В этом примере это не приносит много пользы, но это может быть более полезно с более комплексным выходом.

FOO="BAR * BAR"
printf %s "$FOO"
3
ответ дан 24 November 2019 в 00:37
поделиться
Другие вопросы по тегам:

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