LINUX.ORG.RU

Оператор «фигурная скобка» и переменные внутри.


0

1

Когда в bash-скриптах возникает необходимость использовать подстановку диапазона к нам на помощь спешит фигурная скобка. Очень часто используется нечто вроде:

echo {12..164}
Но что делать, когда одно или оба из чисел выражающих границы диапазона не известны заранее и могут быть определены лишь в теле скрипта? На ум приходит что-то типа:
echo {$index1..$index2}
Однако это не работает. Я перепробовал многие варианты: со скобками, без, в кавычках, с апострофами, экранированием символов... Всех вариантов не упомню даже, но результат гарантировано одинаков. Конструкция «{a..b}» корректно разворачивается только если «a» и «b» целые числа прописаные железно. Конечно, можно это обойти созданием некоторой функции, которая... или, к примеру, использовать for/while/untile, но... Иначе что, вообще никак? о_О

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

var=`echo {$index1..$index2}`
Или даже проще этого. Помогите, пожалуйста, понять суть проблемы и не наступать более на эти поганые грабли.

★★

Последнее исправление: zzdnx (всего исправлений: 1)

Суть проблемы — это невнимательное чтение ″man bash″, там чётко написано:

Brace expansion is performed before any other expansions...

То есть сначала раскрываются скобки, а потом уже остальное, в том числе параметры (переменные). Вам поможет ″eval″, но, только, сейчас набегут и скажут, что ″eval″ зло и всё такое.

mky ★★★★★
()

seq не подходит, ибо всё чуть более сложно, чем я описал тут.

Благодарю за eval. Если честно, то bash я изучал без мануалов, методом тыка и оплеух от системы (сам понимаю что метод не лучший, но я не привык искать лёгких путей). Про eval даже не знал до сего дня. Спасибо большое за помощь. Вопрос снят.

zzdnx ★★
() автор топика
Ответ на: комментарий от zzdnx

Благодарю mky и Spirit_of_Stallman за быстрое решение.

zzdnx ★★
() автор топика
Ответ на: комментарий от Spirit_of_Stallman

Работает. Всё работает. Как и должно работать. Дело в том что я не знал о утилите eval, только и всего.

zzdnx ★★
() автор топика
Ответ на: комментарий от Eddy_Em

Нет, мне нужно было подставить в границы диапазона переменные. Не зависимо от их содержания. Теперь всё работает как надо. Проблема решена полностью.

zzdnx ★★
() автор топика
Ответ на: комментарий от zzdnx

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

Spirit_of_Stallman ★★★
()
Ответ на: комментарий от Spirit_of_Stallman

Для конструкции «{$1..$2}» значение переменных не очень важно. Если цифры, то диапазон в цифрах, если буквы, то в буквах по возрастанию или убыванию hex кода (если память не изменяет), можно даже смешивать буквы с цифрами - всё равно работать должно.

zzdnx ★★
() автор топика
Ответ на: комментарий от Eddy_Em

Да.
Ну таки есть eval'оненавистики, знаю.
Не знаю вы за них, или теоретически сообщили про seq.
Если первое, хотел бы узнать как реализовать эту же задачу, альтернативно, но если нужно диапазон буквенный, и из заведомо не известных переменных.

Spirit_of_Stallman ★★★
()
Ответ на: комментарий от zzdnx

Всё-таки буквы с цифрами мешать не вышло. Либо то, либо другое, но буквы доступны в обоих регистрах:

$ echo {A..z}
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [  ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z

zzdnx ★★
() автор топика
Ответ на: комментарий от Spirit_of_Stallman

eval is evil. Это, типа, не обсуждается и нужно избегать его любой ценой. В случае данного скрипта, наверное, будет предложена bash-функция, которая, к тому же, сможет раскрывать смешанные (из букв и цифр) интервалы.

Удивительно, что сюда ещё никто не пришёл с этим. На всякий случай напишу, так TC не читает man'ы, что eval раскрывает переменные «до упора», поэтому если в index1 или index2 будет строка ″$( rm -rf .*)″ то строка, полученная в результате раскрытия фигурных скобок, может его расстроить.

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.