11 * (...) как параметр bash без кавычек - PullRequest
1 голос
/ 22 августа 2011

Я пытаюсь написать небольшой фрагмент кода, который передает небольшую формулу другой программе, однако я обнаружил, что происходит нечто странное, когда формула начинается с 11 * (:

$ echo 11*15

Аккуратно печатает '11 * 15 '

$ echo 21*(15)

Аккуратно печатает «21 * (15)», а

echo 11*(15)

Только дает «11». Насколько я обнаружил, это происходит только с '11 * ('. Я знаю, что это можно решить с помощью правильных кавычек, но мне все еще любопытно, почему это происходит.

Кто-нибудь знает?

Ответы [ 2 ]

2 голосов
/ 22 августа 2011

Как кодируется ваша программа?Если он закодирован для получения параметров, тогда передайте формулу, например

./myprogram "11*15"

или

echo '11*15' | myprogram

Если вы сделаете так же, как это, в командной строке, вы можете случайно отобразить файлы, которыеимеет 11 в имени файла

0 голосов
/ 22 августа 2011

11*(15) использует расширенный синтаксис глобуса, специфичный для Bash. Вы случайно наткнулись на него, подчеркивая, почему кавычки - хорошая идея. (Я также многому научился выяснять, почему это работает по-другому для меня; спасибо за это.)

Поведение

echo 11*(15)

в bash будет зависеть от того, включен ли extglob. Если он включен, *(PATTERN-LIST) соответствует нулю или большему количеству вхождений паттернов. Если он отключен, он этого не делает, и в результате ( может вызвать синтаксическую ошибку.

Например:

$ ls
11  115  1155  11555  115555
$ shopt -u extglob
$ echo 11*(55)
bash: syntax error near unexpected token `('
$ shopt -s extglob
$ echo 11*(55)
11 1155 115555
$

(Это объясняет странное поведение, которое я обсуждал в комментариях.)

Цитирование из документации bash 4.2.8 (info bash):

Если опция оболочки extglob включена с помощью встроенной команды shopt, распознаются несколько расширенных операторов сопоставления с образцом. в В следующем описании PATTERN-LIST представляет собой список из одного или нескольких шаблоны, разделенные `| '. Составные узоры могут быть сформированы с использованием один или несколько из следующих подэлементов:

`? (Шаблон)» Соответствует нулю или одному вхождению данных паттернов.

`* (шаблон)» Соответствует нулю или более вхождений данных шаблонов.

`+ (шаблон)» Соответствует одному или нескольким вхождениям данных шаблонов.

`@ (шаблон)» Соответствует одному из заданных шаблонов.

`! (Шаблон)» Совпадает с чем угодно, кроме одного из указанных шаблонов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...