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

버팀대 확장이 어떻게 작동하는지 오해하고 있습니다. 위의 Dennis Williamson의 의견을 다시 읽어보세요.

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이 지적했듯이 중괄호 확장 시퀀스에는 변수가 설정되지 않았습니다. Writing 은 echo {1..5}writing 과 동일합니다 echo 1 2 3 4 5. 비교 echo "$foo"- 어떤 변수가 편집되었는지 알 수 있는 방법은 없습니다 echo.

답변3

자신의 변수를 사용하여 반복 횟수를 계산하고 이를 에코하는 것이 어떻습니까? 실행 상황을 확인하려면 -x 옵션을 사용하여 실행하세요. bash -x와 마찬가지로 예의 위치를 ​​알려줍니다. 그러나 달성하려는 목표를 지정하지 않으면 도움이 되기 어렵습니다.

관련 정보