Доступ к bash [внутренний] номер итерации/переменной раскрытия фигурных скобок

Доступ к bash [внутренний] номер итерации/переменной раскрытия фигурных скобок

Вопрос:

Можно ли узнать, какой номер итерации bash обрабатывается в данный момент?

Псевдо-команда

mv {1..5}.something.{1..5} $x1.$x2.something
  • Примечание: это логическое представление; нерабочий пример.

Псевдо-выход

mv 1.something.1 1.1.something
mv 1.something.2 1.2.something
...
mv n.something.m n.m.something
  • Где n и m — итерации соответствующего им расширения фигурных скобок.

Объяснение

Мне знакомы такие циклы, как:

for x in {1..10}; do echo -n "$x "; done

Как вы видите, bash устанавливает итерацию в $x. Я хочу узнать, возможно ли это, и как получить доступ к переменной, которую bash использует, когда я не определяю, какую переменную использовать. Когда bash получаетрасширение скобкибез переменной для итерации, он должен сделать это [внутренне] как-то. Я надеюсь, что эта переменная будет доступна во время выполнения скрипта.

Спасибо всем ребятам на#баш

решение1

Вы не понимаете, как работает расширение скобок. Пожалуйста, перечитайте комментарий Денниса Уильямсона выше.

Вы думаете, что когда я пишу mv foo.{1,2,3} bar, оболочка на самом деле вызывает команду несколько раз, как если бы вы набрали:

mv foo.1 bar
mv foo.2 bar
mv foo.3 bar

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

Но это не то, что происходит. Расширение брекетов расширяетсяодин единственный аргументзатем вызывает полученную командную строкуодин раз. Итак, для приведенного выше примера оболочка видит, что аргумент foo.{1,2,3}содержит раскрытие скобок, и расширяет этот аргумент до трех аргументов foo.1 foo.2 foo.3. Затем она вставляет это расширение в командную строку вместо заключенного в скобки аргумента, затем продолжает анализ командной строки. Когда это сделано, оболочка запускает одну команду, которая будет выглядеть так:

mv foo.1 foo.2 foo.3 bar

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

В любом случае, единственный способ, которым такой аргумент был бы полезен, это если оболочка запускает несколько команд, чего не происходит. Чтобы запустить несколько команд, нужно использовать настоящий цикл; раскрытие скобок этого не сделает.

Что касается $_, то это конструкция Perl, которую можно использовать вместо переменной цикла (как xв вашем примере цикла), поэтому она не имеет особого значения для раскрытия фигурных скобок.

решение2

В mvчастности, вы можете просто использовать -vфлаг, чтобы увидеть, что в данный момент обрабатывается. Как указал @DennisWilliamson, для последовательности расширенной скобки не задана переменная - запись echo {1..5}эквивалентна записи echo 1 2 3 4 5. Сравните с echo "$foo"- Нет способа узнать постфактум, какая переменная была echoed.

решение3

почему бы вам не использовать собственную переменную для подсчета номера итерации и не вывести ее на экран. Если вы хотите увидеть, что происходит при выполнении, запустите его с опцией -x. Например, bash -x скажет вам, где в ex. Но без указания того, чего вы пытаетесь добиться, это будет трудно сделать.

Связанный контент