Bash-скриптинг: проблема подстановки параметров - PullRequest
0 голосов
/ 17 сентября 2010

Я пытаюсь написать простой сценарий bash, но что-то кажется неправильным, я проверяю следующее в командной строке:

DATE="2010-09-{10,11}"
result=`\ls *ext.$DATE.Z`

и выдает ls: невозможно получить доступ * ext.2010-09- {10,11} .Z: Нет такого файла или каталога

, но если я выполню это:

result=`\ls *ext.2010-09-{10,11}.Z`

, это будет работать безупречно ...

Я дажепопытался удалить кавычки из параметра DATE, но это не проблема, руководство bash не помогает, что я делаю не так?Разве он не должен был выполнять подстановку параметров и передавать ее моей команде?

Я думал, что мне нужно экранировать знак $, но это тоже не сработало.

EDIT - Объяснение включеноЦель добавлена ​​

Я пытаюсь заполнить переменную результат всеми именами файлов, соответствующими данному шаблону (* ext.2010-09- {10,11}), я знаюЯ могу решить эту проблему, используя цикл for, но я подумал об использовании фигурных скобок для краткости.

Ответы [ 4 ]

4 голосов
/ 17 сентября 2010

Проблема заключается в том, что когда вы выполняете его непосредственно в командной строке, \ls *ext.2010-09-{10,11}.Z - это краткая форма, которая разбита на две команды: ls *ext.2010-09-10.Z и ls *ext.2010-09-11.Z (из командной строки - каждая из них вызывается впоследствии). ls само по себе напрямую не поддерживает подобное выражение, поэтому, когда вы встраиваете его в скрипт, оно получает буквальную строку, которую не понимает.

Расширение Brace поддерживается не всеми командными строками, и не рекомендуется для сценариев оболочки :

Расширение скобок не должно использоваться в переносимые сценарии оболочки, потому что Оболочка Борна не будет производить то же самое выход.

Вот сценарий решения:

#!/bin/sh
DAYS="10 11"
for i in $DAYS;
do
  ls *ext.2010-09-$i.Z
done
3 голосов
/ 17 сентября 2010

Это происходит потому, что расширение скобки происходит до раскрытия переменной. Сначала это расширяет скобки - за исключением того, что в вашем аргументе нет ни одного ls. Затем он расширяет переменные. Тогда это бежит это. На данный момент слишком поздно расширять скобки.

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

1 голос
/ 17 сентября 2010

Группа {x, y} больше не раскрывается, если вы присваиваете ее переменной.Но вы можете составить строку типа «ls ...» и передать ее в функцию «eval».Bye!

0 голосов
/ 17 сентября 2010

Это поместит искомые имена файлов в переменную:

result=$(echo *ext.2010-09-{10,11}.Z)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...